From 98318cc649a56b946e6ed174e348e4e07007fc03 Mon Sep 17 00:00:00 2001 From: dmccreary Date: Sun, 23 Jul 2023 17:38:15 -0500 Subject: [PATCH] Deployed 5415083 with MkDocs version: 1.3.1 --- admin/gpu-parts/index.html | 68 ++ demo/index.html | 8 +- img/donkey-car.png | Bin 0 -> 215787 bytes img/event-journey-map.png | Bin 0 -> 327157 bytes img/journey-map.png | Bin 0 -> 47811 bytes img/joystick-F710.webp | Bin 0 -> 43298 bytes index.html | 4 +- journey-map.css | 35 + journey-map.html | 28 + journey-map.js | 46 + search/search_index.json | 2 +- setup/gpu-options/index.html | 1424 ++++++++++++++++++++++++++++ sitemap.xml | 107 ++- sitemap.xml.gz | Bin 226 -> 227 bytes slides/~$November-2019-Update.pptx | Bin 0 -> 165 bytes slides/~$Welcome-to-the-ARL.pptx | Bin 0 -> 165 bytes 16 files changed, 1665 insertions(+), 57 deletions(-) create mode 100644 img/donkey-car.png create mode 100644 img/event-journey-map.png create mode 100644 img/journey-map.png create mode 100644 img/joystick-F710.webp create mode 100644 journey-map.css create mode 100644 journey-map.html create mode 100644 journey-map.js create mode 100644 setup/gpu-options/index.html create mode 100644 slides/~$November-2019-Update.pptx create mode 100644 slides/~$Welcome-to-the-ARL.pptx diff --git a/admin/gpu-parts/index.html b/admin/gpu-parts/index.html index 63be7a46..2f428b89 100644 --- a/admin/gpu-parts/index.html +++ b/admin/gpu-parts/index.html @@ -1416,6 +1416,74 @@

Visibility

on a Arduino Nano might be a better idea. See the Moving Rainbow project for sample designs. We create these at the IoT hackthons each year.

Sample Parts List

+

2023 Update

+

PCPartPicker Part List $769 with Monitor by Neal Kelly

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Part NameDescriptionPriceLink
CPUAMD Ryzen 5 3600 3.6 GHz 6-Core Processor$95.00Amazon
MotherboardMSI A520M-A PRO Micro ATX AM4 Motherboard$101.11Amazon
MemorySilicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory$23.99Amazon
StorageTEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive$22.49Amazon
Video CardAsus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card$299.99Amazon
CaseThermaltake Versa H18 MicroATX Mini Tower Case$49.99Amazon
Power Supplybe quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply$89.69Amazon
MonitorAcer V227Q Abmix 21.5" 1920 x 1080 75 Hz Monitor$87.29Amazon
Total$769.55
diff --git a/demo/index.html b/demo/index.html index 073de536..0fb4d2e4 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1437,10 +1437,12 @@

Demos

-

Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intellice we like discuss in our classes. Here some demos we use in our classrooms.

+

Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intelligence we like to discuss in our classes. Here are some demos we use in our classrooms.

The Teachable Machine by Google

-

This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a "classification" model. -Teachable Machine

+

This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a "classification" model.

+

Much of our classroom work is centered around the hot topic of Deep Learning. But AI is much more than just Deep Learning. Here are a few other areas to consider. (Taken from the book The Master Algorithm)

5 Camps of Machine Learning Demos

Connectionists (Neural Networks)

diff --git a/img/donkey-car.png b/img/donkey-car.png new file mode 100644 index 0000000000000000000000000000000000000000..15ab7188e2234ea2c6daee1b0c4adac36225676c GIT binary patch literal 215787 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 M(&PrlIh`sxaZT3Ow9rRz8$xO_{mqyD zWBSuS|6kd*W&mKzL?Bq!CKMtFQdkd?j<3ZL9W}6$+#Mj+2ci)_+DQd=o#sgrDY&&% zUaaf0E~$#xnC=*bos3mRDxp-d=U^+H})8Cqd=RLmJUNqmtxyGS)rHfU9tySE4j6dm``s zZQ&tfu@>hdvyo{lT)=JJ-fF@HhGwd`_Mdbr53&YQuZ3$o2JIUwE&}I`f6Mq*Q5>V- zKgJffc92{j#S^&O4a4jBkWZM&Szp(R5@H#N>n#4~yGx&2wr(X!YKAq{ZU6~3kHTC+ ziKG~Md2yUr+z|I5q=1Vy;!K>cYgJ~fYukB?6AIM$z4vi!%wM;x=fvC@NAM*EE-w%_ z3_qyo==w6NGPXSt2>jk_U1ZQI2!%nu+Os$GC_J;a;;lPTs5t0RGQQh{a@|0CvKs24 zblt0H&&^H2+UXuMejyDG^rs>CYa>cx9Re=g$H2?BcO7Kx^_+Z}%)BW&*C5ak{JQ4l zkIw7z`wMBu57LBi0vIt4aVS1#dLCxrF)36YiX(MFtE7ZYyJ6&1y^7k zRze-A+QSn=k*G04ykHS`f$^p?h{X*P-OSJ;UJ*{<>mFKV$JTXx0a+UnX%sp>XH3q; zmGQnI@6={D2`a{%-%EThZVsR;uw7I&*HRcq-u6I3 zSphNi=d0b9U{;G9OU%J!3=!6Sd|V*+3DZ4UjJvaxpyrJSucuYh{uoanQM~$Z`$r;| zpa68Z=I*%bjpum6kQBm+djMxM87si2s#*%e zQB>v;0BxkPYjL@zp4mzaYb(sIiS*l0U=UO)4R5~tO}ODoqo~+!8YTr8L$e-5Wl9v3 zKpAi}3mu!FK51kuz3ra2(C+N%G&y=U?QW?`hwpqpF@}Aq|LoB;eC%X8bD8N^17%$=vcrf!L zhU;Mi<*0#VtyCOCV8M{Ih_%eGV;i2)iBoJ$+8aW*x~45?-xHm;F0a@ogR6xrnEQ&4 zj@A2kUNQT|4Gj@{WcPt31efvljJJ$|HCKV;XN)s@RAj(m1v0>ZgRthj5ZcgRoE+Ds zy&K*mt$JOf-tPid-2{Te*CnK`!;rXgKICgEtv~h#mDEs`|;kW}ig5V2mROA|A{5R21wsFF$K*Zcn51^*q~q78fkplDgC3 zg%e~*TYAC7c`$~}amv?xFAjtP#aQyVvf$DKrjUxy_%2&qo5~fxD1hS-IlFDoX^{l72^0_{ z0I2rkVmnBF!D|N znxB~?zA_N4nObo^P6{%%M zgHdXZ+B@50u}q(@1ZmpP81zS*kYLuJ{#_SJH&!W{a1rqcwWVo-$MZZZ*s8Ds6^xp~ zl{WcgF>UFx2$Gf&)3c7l0^PgsdJ}?cU#y#m^LKHG&>lhHYOcIC&hd`7y$zSe{&c1f zmoagi(n{A3#=!Wsu65G}ZGd(lq2{CfJs z|Lqg$>1U3kaIoBz7N~GhiysV7jWT){S~tR&8mJ9vZEOawDkAYlZGPv@UBqPQnTSH8 zQZqhIyn{Z9^>rm_&#t!A%I>NYV`MoRmn8_lMkjeSYF#sC(1q%vjsy;O>atXzMt;>YtyNh6!`PR5h`@2R27rVGK#CFHFfX0Dh>6Y zgV~$`ufa!3J&Xq&*n5zM!2{rU&TgG2V{#f-qMfg|Z{3E)g$oKC&v6*6FlfLm*;#OT zlo}ZE)*~1W0CuYp;hnp_o1$Km4)5O)b&3~ko22_2K!@VR9DQaP!Fkp)c$T!7Nzv=d zc7Z+4N?5MkQ1`nw?9Dgc7)&g- z8B#&u9$LhfF(7&(xodt7p@x;TwtzcpaSS@FCwmYty!qJ*g2b*mesB4WEKI&CPgGeJ4%PqUlK?ZFrTIt};@J%1jE}lXftkt*mrx-O z7qqTxlrNhl+cR>O_}?6EWreU^J1{4R-9x+Zv)Ic|UdsGhL%CWbC4Q7q71PXMXKL=; znr?r?P3gd%eWdB(wF6Lr=P~G4|ML?IE`Kf)RpYRk>@;1vPoM5VnxY{yVD7|33DSZ1 z;TBw_3k8#?rEW*0&K6feV#}ByI)Uiw@vI+Rgc8X_t}?6-jJO~+v%<8LBB+N38RjT} zUgExHP>DclcWPTQB$?eTE*rO%H&&xyttVT}_c8<1leO5?h-Hcv%{I5dP$7^NYqE%~ zxJ|l?BIB-uxv1SU^|+r5z-&R0)3kB#i)|cPN~U+l9zvXCTDUHNXw$-Zx`dkPeBMOL z_yShw96L?V(_FF$23kZdS|!Y%n(L z##zs)o=7-R0NBIK_#ul3I_P3jYh(>WQ!a+Ej-~H^{}HO|AwJp#{a>H?boz_G{1k$L zeu!Xe1jYFc2*WjGb~30OJ5_`9@LIa39E+A+JME;@?j>O312QjLHtBwKE1t2DDPlFm zKZ@y3Sl$Ft(W!)UB490B;WsjmXvpe#!n5hj)L@z$n@c;cz7A&Jl%8i3#S6oI2-wa@OIB0WRr&a1U!lqI zk!Hd$Q&fQ)A)dFLnbMs*#uB{7OZ6x z_w82Ddm0OdtVUKU7<|A)S3C#c*?jiJ<{Ji}cC3fOBnUf`n5FA|+(cA5k)CDn!n(hI z0GcrAitQnB-3m7^6-ijqIPeoc>QydC(LQ&spKCI9U@D#Irj-8tkujv`EFQ}ZW2c?e z(jqC-WDxG8kL4_NU#8k?*{q@%$$V{YYZ6ON1Yt8x(!%F-6SAf&SbdJuL<$9D@CXT( zITn;ZpVj1LiUk)~Bw8^Z6AJvjzjY1)uT6ZCrXyC(c?xcmUTi!doIoJPD5m~D?7az` zT~~SFd0y@Nu98YpY2PJF-h_AK-C%-QP1qs%rIRLsummQFr@Mzq0!e44Cuy=wXfo*u zBqU@=eo6OqhanI!t1)=P$d+X7s!~a{@B1?U|99)kh1+1_-B4GmdavHQ_uO;8^PO*B zWK!7?LIUGuv`rHtK*~;w)BQ7}Wv1^m0~<`RoUgeU3Wm0grUfpzrp{SBn1I3C(OWpW z7VbxxVl#qy6ZH5@$EnoQOPD+YopA?^RGqOigYb{JF;B;maRnTF?;K$!&NIX}U=vy? z-&qt|A=`7Z>)d;;htJAhuP#6(MLI?VKtde${pQ9%mZUK~mQG|8huV1yAfVxWZ z@aCd_m-iV!AR1T5ryE2a%EC=I-;&-yLEQ@JKXdW9o^i(ILwIPTd>FHcO$QeUtI`Bw zDHrYS3m}|TC1y=bB+{rJVy&uZNUnWnl$<0?F0>OASb;DMtq-e==)htSI5O_x*nT%f zfJT_0U`hdKnNN)AB084rQ6E$G@M4Ni)OAR+B4RP)x)65jG;c#mJ(w($kSSVydz8u< z7JGD?DD5HBaBnpVfeGngVMSQ~Qj-*Cr4W8@-i3&70;*0+{T;*jKQwj5f`b71fi&N^ z@JdjIsVbx?@l;X!tDfY_SKoeny8UH0GfpO9=kVrE&+8G$D^kTn8!%By?$++~&Ud_n zc{flkgD$k@_pv4trveh8M{W|)#H7z}nxKiVedBBC3;*=rsXzGL2#(Od2S}G3{NaB$ z8_>2zx(q8@ch-PSz!wlg61({^dPxC8NzkZK!*8cyTyvx_j35|{TP2}l1?IF(tS!P0 zTCm!7wt%r0F$-z7%^0PoBgHD2#uvWu&uQ!S-KiY=`~a2iM~LWJ*;t;|@BgW^=jI#I zGyx`uk3Ec*H$(wn60iveE=NFWYFUG{T$#>xok(B$;^#22Dh*>AVoyvlA8q~mVSQ{< z0W1Wpnft1%uR&YuhUj-ua;h6V1sl1J$AfrM$QTo+`zP~B;ah~MMTs@`pW2Z*Kp|vs z9>8aO0L814e&(xCNs?K?IM|PxswDCOYfd#%QJCt>=91WBG7zPBtq%ql$-G9;1SR5z zWW)Y=3T^{_gvQ829Y1y~#&>Uqu*d_5L$0HEAl~aUDrKHtLwQ4(2mR8L9R&^}44)(E zmMA{1sVv2Z$DXn)u|9RgTA0@`e#0|_SoaY4g1H#xX7CNe2C){d*)vIB{M7lmPsJl& z8OJ&CFCyibmvqMOJm3AVWNJ?(Q8o<;oH4$`$AQ7Hn6@J=DOxpToT?CV#UGIpNRX7*_0pLos zFNHV*<+>?WJBn6l3X10`AP=EjSTj(eFo#7vvGa+wl1ZyUN;COLXozSYeBgSzUeYz0 zq0h+*@EN(7jg`!^mC{d56i==scX5pLo~pEY)27gb)nL~{dn<@N7(yGfQc)9o$cWTl z&Xt~4<3D`U8{e4T_WIYQTHqy=f^j*$_$y}egunhp8dv`CF0Ab<#^y$G*q=2!qJEsuU`KTn;c3= zwmi&`6Wn02kwLzwQ^xgfOf{Nf)iWPh#>MyMJ6pP@4K>;(a6LWe!jW&!EB$VUaaN(> zs0FDZ&Ou0K*o10gE{~={Wm~)QM!N(SavmwM1O`}+uke>{)BoQD!- z&OC&f8{M_ryLWGT`K>RL+v68{7#Jy;BGtMZ_z|WBU?wf#Q`QOz6Bt;{z^Wyhf*jv} zEO>0P>`^5m<`ANxKuo=t_m4U7Dn9xX2d~0jLf%in#sm_dffYdfDFc;IfTYJ3Gji2xE(Lgr?X!6!2<^(3R2&ILY6q>bL)s_qExVuFVgy5uhmFIY6%u5F5eq<+co=yGSXMR_UM7-yMJ%n7h;9tRdfQ19z!E>+= zU_LTXOCW`LkomZJbzD=6b;F2Ck6==8b2Z^9QxH^P^l41g9MiFqe z;4BaxK6HjAtQ7U_J&Bg`DZCO@zLB>3wWCo8m2v-FCw2g&$V&>p6U8X&twGA zYm0SKU=P4>u7|?1DH^uSDaUM@1&T?=$!h}7o3Xf@I{GNS@rht!`auIfR0Mc7{e?b9 z3(>mz3eRB~@SJn!x)8uw7xqaNnwqqww-@Fg=YtE}KZAozJ7cguvzniKG@!++=LiFz z#b?X*99A@j;6it2ysy9vUPnnT1MsFniXQ8Fl0R0BqA`dWu(<(2k>|6B!#Vyo`f=Q# z9t5LJ7wk$GUvf!$?d$JIZ@m3gsUB;a;SA;mYN62Glg%|i_JqHFWX9z{OMhIARWukp z)742?`eRg@pjtN1tHxB1Hd0(lZ>o^6?V*K)ixyQ0L(}P~9|2SePA-GjJfKNPvQfta zwqjpzuBl7|6mIM$Uqrw*^0^F%i#dxQ{%hJ$n~~r^7QzRjwxhYI0)(_;dn;0j{dor2 zNLB$bUx!(8Z~P&cBNuS?7eQ3a>sVlsb!?kDF^_qYM~;Onfd~bq0jS~J<(}5wa~Ykp z$&m}pEf5Pt)wDAMfil0%gljj4wq7G4X9){dg}3Fp$mBw)U9I1AX}aacoA7O|?8~DMN|KV9dn6TV+xkMl0|^7?av?$rP3tiEN~Bww zR`3dA7{>=fG@xst)>nXWc`pw)X9-Sm$Cn5xV3d)jpe7;nt%4XFIc`;kk@T|bZ=k}+ zh3U&*e=v2PIhEG8uS!>3cT?KDZ5y4I|2YjqEGi*@-}vS~rb9;_3Js`$PmP(zKT9j= z4>4dzvv%|qL(?)~WCs7RIPIf^R1NhpG1Uk%8LZc+5www(qN!T*k(w-27$FT4ocP2) zwTgm~xa_q###B==%Fug7t`~dAoG!PLSgbImnP0QIVe7&g84aysoaFB=EC<6B7haF> zU|2j6vaHV>3@eB{BY0m4vUApHfAK{Z0k7lnnd3W0?`5Q)4AMCm5^bSds7h3j06SPZ zih2`$Rzg(j$YK1dxv4nGnao^>&0 zSnh#J@I@;E(<4!u4(rggBIwL%Xs9Wbu^#ib^jE*X zf>j@a*vZb0bk<&u6LjL>vt7IQr1!n&z3CU<`j&Lj_U(*=;064`GUGIO9-sNijvtwE zJ$@jg|MWYEXvdEokM6iem`uy{St*gftb`(|m=4Fs`@+PgB&JzFY0h(W5ZaJ! zxuOXqDouls0>%g=^s6)pHjGjo!4gDnJf%q`H_nI!cPwr3R-tz@sG{ctoSAcE4q6GQ z(j-eA3+_(MBpaOFNU>E_Bw2EgF_@=#V(u5WVopR{GUm!vbUxm_D_yvE3p6{Ed>sA7 za<~q{%3QzK&?BLm|; zhM9|dN{MbL32YHKWSH^)_r=c>SVMoaE3Qb5*!aJA*B6nFhtj2&-I{J8aOGR~d^vsZ z;63=Rs1Tqz8hkXORK}&bC+^1{fJerB1Ao8^n^cN_K4JbNb1@~s+(i&G%B8I&xTUA- z9DAiUwNmb=jD~)ui!d_d8Ep$8l~}2L!l?WapEIH?qZeiw>_l+y#V3K=AsB#{;s0@s zBvKL<@KOIsf4{y%0;Ry`N{CsQ?wMCGeg#F=Y0c_3eBZ|c_F+O}&17o%o^fTZ8t#6# zeUN~VDM&o?N*gj*^De~?=OA8~_F@f7pHn~JC>9NSRDnLs3BRDi(UK!4e!)ywgD~L% z_b?H<-p~=vkB-md2M!9GFo!XjcrUD6Io3rOdaZjri)NNSW$p(fU}b(`hV)sT6f>2H z%LuhVSX|l&LBs0xQyOWfi$are3#l)*PC7+IV5|rCW3jOi&{_xhJI_9zSH@w_y5T+w z8=pKG@QNsAOm(L_PqJ22uYhUFPzJ450?l)cGZ?s@;2qB%2hYOlh7joUBSB{SiqH8l zo;BPqT;tx*1!9>uX}x5M#43Y1m4xw)=M)WL*#Vx8kSvxb_mPKs>HJbe(nK0W0B)85Yq*h z2!-i|`>92!4Y){#XB%NDa+{x{S*udU4Z*R}hvk0E6s*V70E-dS&LAr>PR6*z0fR$&A+Y+ATq_g96$~Vl(srNm3Z>OB0=qNY~rcg;0-H{s~kd}d=!lQJKC=zHnzuic&2ty`0>yZ%}TdT;vH zxBoe)Jf zoROPk^;as045JO0T&wnF(A4Hln+V!jAAY^8_%Cb5G_!r0(Fdh@r)~xQaw0huRK=la zcf%SlJwj;YWNAXIFMCeHuV4~wRbX5abg8a>S(&hOAzuBAAA>*wCwaz93saCl`w%81 z+^T_wFv9AFxs?fsNA{#M7;J4jl}2DH<}}q1uo4N*;M)}HtQGg|y58E_LTRycSgy{6 zz>t}{(IR0$RnSWPRcb$D2)O#bI!>J+5aT54QBM0NJ7{D9D`&bp8K17iQ3kJ)mNVzT zU2!UNN92M-j$`<50{?|tA+#-5Od$cr3*dtZgL~Wv97cG8Df-Nsd#$nP-=T4H150C> zf@1H(e!}m~!?aU*6%2HqYwIY=yoSm-+jneBZ@J@+w1p@_>AiDteX}+G{`FhBmQVEl zDKoBoFbT<;HcSje^>lW2A$?}H;9?%eFyUerr-%^O3V<_AF;iee=w|~`gqn&;iTIP) z++phmD9Vm%J>%ruAU~)@Mvp4BCM7|vemHG0KQaLyHKZVrKr@OPNa@{0QW6nSY?`Re z-vu0@`hAH(k}QOB#1?52qRb7N=7w{*j>D10uET_g#R3@~cJq3ub`ln%!iH8u%` zpJ|dXd{~Lm`ge>-{*XCj5K}gr%@yro6Z2qvC9#bgx1nua0I^>m=VuHuhw=;mRpb-y z`3A9Sw28(qzx7t4(N1Gl>x?zX=}Y8kxwgUfV&uxk@Y5a5wWWfdlR2){4TmO`!8b0x5I*yQI)Sap+Ps3KyOxiXd-yaY(XY7m0+ zmsmvYH8yA!_m_}zSz1A^SU-6xM$(Rr&!xM*au?>oFQ=xe+H~0^m!%^_AD-<#ldiqy zl5{WC^9Kk^pP10R=W}LELQPJ>?!HlT@DcbZ2(XVKvkZdD=cU}g3}VrMrC|ZVrvyK) z{fky%MVRGTCrN4_C&*`v;-tQ+d05~!iri`(VDS7$-1TNbxPT?MPb&x}8D+mJIoA^9 zsU~Eun|P{)W8VcA;!B}&H-RTv_Xj6PFcZFD_o=YWezLu>6=7w9@f6@(Y@Z{Zh0DCZ z61>G^)h>}9*z+NVFICV0jYSm~85LWk`W_JbG%*5(WQsZ$S%AC0`CaP%y zVibax9>UQ%C=|=QWOCj=f=pz>Jcm}7Tu=(#iu(qRumsia#Nk z7RYPhSCl96e&Ca}G+XJ?U5j=y4MErSV7ib5-dtBkBPWqAzz88n4j&4Wnn%2~r(g+zN_b^(&0r^V^MDl|F5u<<1c2Z_=276N_RPi!LElct;_?u!NJbU|-prG< zsif^@CU~X|+jgWIZ+=2u()wU+l9N9<7ZKuuY_=vQT4;kJ~-4L#9q^HKdB5xd-V@bQg`ut>8>w)9$#2R z+Oc_S`ozcouhd5*+A7SZGRF~;Ep=&TS_iie7$w%8@O*NSqWK~BlxRwDB{W9cS@<}f z0i4;sk%F_}lKa4XnTz&rBjLCepy0n_Jljlos2NydOlyEboN)Hlfi&4FI4~vf6CXA6 z8=}RJCVYvs<7>X+BK8D6l+&kp<^kHzG;)3oOoVX|$Q1C{1Q1vWP~4V}sc*QZ4JN|A zfN*8^;(m+w6&-3S1p_Gnh2ZMBwK)nxTY307@@2AB>T%qT|$Cj+60uqxa}U` z^J%iTBXXEQ5f&Yrr9OYeUKFchZDCk2EqzLw(PTb8pLJG45an3{R*nl*52hibv@ zJB!MT%Yp%lQu@M!pmTGzQTzOb+k?N?tZz>@l9%+&Z+s2f0bLQ#!MhlnwJ?Oej6k## z$4Do_XJ}`OdT>hN-G;Zt?3v0c{6{=PGf{h$nis)UgLl+wxFd`YWq@D~`)`p1$B$Zk zJ!{Rk(5fM<12Sr(NwMFARmpi9w6=gY;QD7;sY1ObX7Pp-9G!U>bm5Pmp_~VfMR9Y! zm(E(gP1CUvjYF6vN6^maT`!(BEDKoK8dj}KzxKgjP49a19qF2jFUG$|`5A8E8Z4!6 zOWz03e}rF8nQ=XSY%3_Y5R>2039?hKZi?ujSrA>8(ohTF+0?ePu-@P($myOe0htuH z-B_WPi{v1U61VER5`vqVcYKpYwHZ|?0+^f}c4bUA@FlYEwZFn3F)b;%cx^R{uk;LR zhIzr@jBuEOWOFk}H{46#l^Y;Jd%35X=wZW#(0Om2{8MaVqhoZ&Dp|QPl;&LpiJi<_ zV&kj#GelKK?6{gCOwI}#*2UFSIw%FWnO z2?j!8b$Lxw?Ib)~o@`o^8Glc(&JR5FFg~y^lQ69Iqoz*s`kK`cp|UU~M;RraPl6IA zA&8m`*ZWIwWNhM*KMJ}^xB6~1sjVeh`?AX}MPnHWlk+gl@YSzzv+&?3ZamNta6lC1*S=RV-b#?Jd6$7ha++eDJjbDvniU%EvRB~XAMYT;d}ZAStyeGU}&oT25rbR#E(p^ z6_He}MI1v*jb7nDu z9MVhyiL3zPncG!B^fs!jecc9fwqBXu^9%nfs%1o2y*H2fFca_pV{in)jAt=FuQXkK z^)>0LtF8+FjMdd63Y70NjmZaQarkjPT}L%kH-wkdn?`dO;!)-xK#i26Y75*pXG>z}vw3er!-G(8omPQd zXwh0B^RR}Za~tTT%o_K+_~J{_6<1uwd`i+i-@H2=Jajm9pE--R1fIj#W$?l-!mxpd z^Um;GA&}?Dz#Gg_v*XU)JJGr*LJS^j;^qQ;t()+BMND~w)`R(=mh#MY3r?{pF)9Ms!yLZ>_^yuM7L;C>ZLc`UkRRo=~!bNX) z52cy9ffvsQ-Wmnyx?t@Lrlo*y5ZX#CSdo^2MrBxjR!)fy-7tD4Ls5hVo{>NdA_`4C zu$g8v3Gg)}kau)-Fnq6ZkJN?kOSWc1SfE(xITBJ~6xxxsg%;5vwN~3NT3IP(8YSETOafNaZs2o^ zct)shNK+Xy=7dL<67PLT9z4uD09L?TPGlCFyHSd2NNyN6d^x6;+8R3BA_dz0*f!P% zQ0T944A)Y7dGu_8IGNYw<`t2wQ&v?$5D3gkNyj!EHH_srY6LQ3^RR5HS-~R8y!6E> zN$b0Ee!UQbKv>RK?JviyIZ7yP1>FlVMJ3T=~L26N~#4 zapGCI%x9CJN*EL(uD$NM=*4sF*s-X*;kpH3%?aHiq0;maOda^npdAn4H$pxDhq5&^ z*GRLljLnTX1`+JX$L0Ni>SG7vdw&;RDcwydPRSJ17^0Or>n z<8mHq`8@3Tf0}&aF}SI?CCWK2@4}KG^YyvaatyGr>dU50n;}lt97Lmpp+K*>ND`I> zGB{2y4D8ymgKLHY?g3{AX3n&H4J`{Mt+pgll=#b>%|(*gRn#;ycbEpB&%yvC)G`mv zQl20FN6vT60822-FmE{raRfMp#?BtppQZUNTnKz`S7%LwGOgHaJ_dLwhGZ~^A-SK- zJ%bsSEgrtn8X&G@W>U||G%Ov8z z8LoGj)wsN%=@h&QTA_&!Gg6etVjSxzIJWe z*w%)|Zt1C+)J7NM3QU(Zq%oCLm#6J}cBh|z+dI>B`}Y%*z@B5Txxb&u;~8UIKA>Q5 z4)S`1ksmhm?S>|K_$0-GK7A}$i06+jqL_t(^_v}j_`#*j+U3B4I5Ep5XX^5CX z1Vk_q>lt3;XA)ta>R7qN6-378WNEi;*^*vy+il>j)tX!p8@>8N>xJr_bEN zFjq3p#;n$qyo*nGB znh2Hy(pO6L1rZq4-Q6Gl#8Gm)s>*6G`NOQyWUVseo)do!i#7*rltzKpUeqE|Ci8$0 z%A7pUJI(~t@U22AbOOd~@J`$6)tCdVfDWVL3xfls01{f6oYoE7zc{Ye7zH28b;Z8t zEdMD;6ma<4)U%Y{ZO&h&;9AQV%*P5~a(j=^w75t70|vrX81aGM25x9rl+H-i96xHE zvbQr0j5PuVGJRe^2XpBY=<>ewU9k@2}-QMgIm z|BUUt5pZi@J_=;R(28M%?2IOYQ_z-z7^>Cg5swLc3b5128)L8+^%;W?NgQ&@1Vgs{|ZYrfdUt=S( zV3E)aA+vd*S^p(4o$4xbR9Gw*Pz{WekrD~>XA@5&9cqf4$3a>^lbnHIX>tM;qwItt-m@ni!tABF%XL-bF|tnr zE0YrkqCXJpEJ2*Xc|Sz)SvR5Pt155`N&>D;V20##);9>foA(J0aYe!w08v1$zfv~e zE3JEvaFBziwjZfzC`*@LP?}zK6>S%`Ofnxs#A!}Cs|gTItOU)wlu&1IuBW$;c|c&9 zuZQKY)L?4SsCA$l_HN#xl|2j?GSbl^%=P#(G_zSsY(g^-I2A!F%*W_e8H@0c{OfO1 z`w(s>n;NJA#s(vk$osiZ8_(?|77stqzso=K9QUgcgcjAUC4X`j|EtAo%gPv^P&frQ ziMyJ~G|x7SByU~9If!Shi!cnrFVmk14K*TeVJ;H;9Hv?`tYhi^^}g<2|BaB)Z2{l4 z)U<1CYDL?#!!n7_QBef}VNomf;nlumUb){>OOE473xtW`;TE?J(;yG2hUdNXZ%e=n z3c&&=*2g#5pTfnPD!edMz(k?OafOfLS(!qDE&ge35z(@-HGfm7LZKV$j8+)uFJo26 zR%l&8u3rzm=+vY`C}X`!pe?x0179WVnaSCL-Q{8S8>Hu(5rbANk%?G?bC@vmE~>xt zSiv0YYGEE+t6M@^*?=471ck3P`@*#ZSm2D;WtHyR zLn#7LM%gG)Q;>1p2qKe*{w;eBm7-2(PST9w)FS;_5Z5T4IV9we?g3y(tBYoUkhC$W z$gniqSR7IYcd2hH$bQ#0>3Ol<=W16hod)uX<^9+StUp)1+|c4$MJmJGBYh(%*dHQ0k&Pb5R+|wE7Jo zOyNHTVKhS-m|;n)ZX|8*(bj6RFj_wq4b&V=DwQypBPM}sTU|(J&h$kMz)1@Cxi7-+ z8x=qhguqE@frQ0=beiwbk7Dl8gcYVEj(SLdat0b7Ecq1#g@J^P=Ls8I!`J{;pT(vv zn}cy4I(!7PEVc3gL=muOr*Llrq|jcFB;1P%a{N#AM2ijLS9Bj``CphU@%ed9Fe+Zv zh?Uw6hYv{{f?o#Al=zQ6O648W3tVDrfYz~xxe;2d^$;l%ODJ3!&#eDgLLcqlS!cisZ!oSI9nWcs2X6(##3$0tDID^aMik)*=3brH>z)juyR^G3A6SivFJQ$c8iXzk9^r-+01RsiI<1CTKv0+lCe_TZ z!U$dQUXTV@GnnRgdZu5WQO1=|PKKe` zf*p(otfzJay~1ss<4 z+62`@5>X?=02qtoA_cJop)~$#f-*VK3d*9i-&@XKN2P?rgMA%8qZISh)RPkj7c#yF znY5M{lQ%Rqsacb9Ic&O$lIhfnd2#*DbvV@brB}S{7V_Oza0$-gq-h1y2jm-6*B_B%3SAnAv(@SY_9kdBJBk8ulxIA*E#gfE^ z77q=**EyY=2p@yH#FzEwyID+0^YAK7R?|~5GnfK|W$!Bdn3G5GFSVw@`7P=5pLrm? z_R4+fs6=_j`@Vd6%%bS2=O6gLIZi?j&_6-p|w*r4aEBG-L zgecNHuqssJ-V%9)#vYogmFqM(vzl`842j!aZQNaXcatepjoTmUO9%$K-PV;SylZl`}k#pjs zoOmyS#ByvwAAn0lQ_7qn=;2?JzCagr18A0us`kLrXuwsJUuq&KqO%)q6w8aX0#~#( z)7pmU*Ir6ep&8cKQ2vhlmOu|?^*y<+Fh%`#GN}H3I?Cft33viBKhKJB$5a<1`A81{ z7-a}VRcQV)n}}d$4q7J;K5{_0jw}TjE6*mg*Ub_S4}SAhfiEhaB520EpjVt5RfnKS z3L=4Pa3A*sE#z1mTslOR>N_68a^_xAqpT(hdds$*>0LM6L{adYQ1Td9{NmLd*=Lt+ zG3O6+WZ-#vzk~QNabG<|Xpwl`>UNTkv6l~=jhv~BII!7t#ByFe(SP+2ETtrYrbK6- zo(Tdx?61|>Xt73Y>->$78JpQntmL4CR0J}V;h-+T#w(JFTy6%X1tV($@$4A|0*zvd zabpC*WKO}jSVTkMv&z#fitk}cE{;_fX2%KpCFExeLgL)xJHKbMg!IWmO5}=AkE=1| z=+K`5X-beTH*a2_e(q=9mTtZ2`e??-sm#ZGA=fyA6K{VakEQss^u3JVGF`Xad<)WS zU3%!j@3Pb~Ifw=@kD{&otwydRyMYSR6$n2i5Pl_K12e|aY9u<@Izy14@EN^wb3xqn zGl)Pei2KbiO~jNChWU{5t>|*$j;eI?9`F)B+ULG-G=240ReIBY0wG3A)8?Jx;23@B z3=5_reeYlpC-FlDk(nL2H+#VLDhe|r%*(oeYF;1=L>vtSbKp4`#t1&1q5@SGxPE}W zQiQpOSp=#(PjO8l%AF-cHkZ+=_mT7HWARx?CC+sm2e2;g3R(9tO;;)JQ-FzqY&`9V(nZ!){H%` z->sCqP%SW!UB(f13NFkGW)XXivt1j1ywY(LUi9@uH4WyNX;=_(@GA;o^PR8yo(wlP zQq*}_WVWG+GDd6GGH7)=BMdkvOoJUAX+3#&YuBu!7ahSm_)4_^neu@88n|1Hh7xWO z;59Np|2QJB*R9=3ZYTcPIfBVnwnos3@SH%DROy#Vf$6dUrk455b83fKZz4h&UcvLkS>+5wD)U<=>=hmAWquCjpWl8 zRf#jR42in{)0l-x^^;6Fj3eAKPUeBwiohTXZNX|wQI?5~6ZUeDNJMlFwp%xdMAMXr zqIoh9h7G07UPrnn02hP(5*x|)s@B%-Qj%=MWME#*B!s8FX+^ql_ull%pSmsGddm%% zKC=0S=~8U)DWBzqjhnoPe@T3I@7|rRzyA7g`gc)zL#ASB8S_^pG~wUm)s3j%OM)U1 zjWi4i7N09-O8A22$3_-2#j|bLrZZ zNYo{@=@=Ao!^SnKyW?~^b&iVk6)3?R|(Y<)!G zkqH<9XK&77AeYJGypcC79@!h${_$kgYr~fXv*9iDM4udjFze;I6|9WGtI?hDYz8kd zzExA4kCB0Ojdj$kY$1T9pFoA-NU-gqdXPa2mIpIRTBZm;=3c;&>1gUTYS~pBB(GE& zWD66|Yb9L1ub-Y|1a+)v!N0{dni=&g8Z;*Tngw=h%9a6ZZf>H{Dd`ZjG;xL1a>Q!Q zg7(MDaop$gA(?hOoA0$M$)tT|H9Y5Kcz!0(aqc25)|wQ)EoiRm)=rMvM?U&n>5Z>= zB?Zxa4({yQfSbZp*!a41ZMge0ejxfiTSvBmMLdHguD#;gFcEzIOJ7Kj9HIg;or@>% zf61V1U0+{|3T#zj6B??Kpr`&KGJIGfsyW*JUTRR8rUeeTen^l~FE?N8;KxY(69Q_! zFp)ZYiQp?W(Rdu`moY#BBgHH+^ap?at+aM?d%EhH3)8oceUr~6j}TgL0eRP3h4x@Y zmN@u4+uRAlRS^{jsxcv1J5xbU0x~`!bAY))JfkcU*F^Fy&**1PeTMtYvR}?KEAPX3 zk3Y0Vc;tj6s*C`KAW(cajV2`lvnZ;2)Eb~Wc3&6;g%3S)G}}vy!x~~=D8^F39%H}^ zm*Fe5jrd`BQcYFS>~ayugNRyU3t>+!#Dd#|XT&~rO-(_u__h|30|yVmv>ewQIhwuF zPG)@4j^*qZ#?z1OVTwU8Yd0}-P~#Hf9--mlg`2}IA%PFr^LhS#mACYnC@uhF+iVnOfIFIK4PoA@l@Z|#?iE4o=jg?8s-ug5h%vgFQ_-F(BU1<+6$I-@ zqee$@iy%k4Kd;!no0Ds-Y!5uhrF$9HoyN^Vqz3 zXAm#zo|d7ltt83!T-Oz-l_xHcy*Jg3Vh<>NMw9pG00hF2@T7t^awzn12~lA5u9zmm%CznC`CDWF^-fg41HlqL9=!}GBlKRfT9HO3W1 zOpyUZ2=}ywQm?-HDv$wWL7F-K@KL19em2l7c?U=plSHr}g&G}H!w*|32$E8Y4$CrZ zI&%bhj1t9Slpi3)5+Le>PyAG)(KVY_fCN))Xfv%!is|d6*0Mbtig+gsn7 ze);F$9th4zL5MV&<^&{vjTS-{k1G@E6&)V7Vw6ZYbhOeT{kf8gz55Jl1u4p(%m|WE2ud zb}u)S;KPX7FC*+N_qX53bmN_K)@KBBGw(>j(zX~f?ED;a^Yru5$3k10 zg}KfFL&x<1B)rd#d>;u9*I$9gSIvWwxX&CEsKiIj!NSmv-Eki03d;3sSErwO>syE# zyo_e4FkT`nXQ7R8KW-UrBsFJ%I$Y*MAgxT9!@+`N3p|H!!&F83`qg?HcT#H zU=2kp=aCp}X<>4334Vg8IVe$JLx4wYKqMa|=XrOP&Pxbf0}QVUBB!%cN3-?X#*wNu zBbroM!6u7vQ07)sjVTi;dXP};VKl}v>JFAv(;o?`<+htHO~3L>?_h&TY<0|^-#_u* zU*{3&{3pwAo(KXmtEGq4;|+QLg`a;{y77ja(;xrwAJU}pzR;S-$5~6(w6(bnt-K+- zY!YUL@5@w$UfS8~L-MdFtAun8r;2N#K$9^Bhz(3n!eFjYk90R$ss|D*#bM1oQsei?D@@2}LStdOs}+Ry zh4ecOZklXc#C#(lfop8rW2Q9aiAMzkcGc9K{jbMVlkQQvH464ZlHcxdN_3`7)}xfu&EHGB0qh8s}AqB&t2(Ce>L1+f5gX$!63B?_p$4DN#BlG?cW|iXqY?NWDsu)i^!NrXfVwxE+6r zu+MYd=NK1;W~efw6+p-eq@m){y0p5rGQID;zZ8gM1&!t7nT0?`1R)s^f-PINq~H0S z-${4fbr%fmkE8IYU8U_(D??D42YFbFtV^)94oC3OSgX=HaV%*>p31Z|l{j{`>A)~m zvN#}K5Qe)S97$jJZex1M+CsYhiYm(LOq0{MKGpV)q;qK~efL0DYFVSH#=s&8DpVIl zbIcG@c=hnTpGg!YBo*ZM7}TSWR83-H8mSrTk!f6-*&kyBUhnwflgKEpAAR3(o@g+( z+Lq;&8p$CmV=u62!k3&?CShLe0d;~JsvS5d^X2;b2f%a9+RWWYFlrIvZ1orYy`jNz zu9atG9ujBgoiqP<*0}nyU(Q$GP4uKd78foE1#vCp6d z62@WDRp!i5w79>IHYTw)3OAX+u6E0Xk@GgvM`<%34;a=q5?W8GI0KP}5SCAMoDMT% zwvL>`LzW`A#G}H+WM1?BlF{&8&^^q8YNzG`+M$9Bd&b~gZnD4{6cmD7e-fjuJNvG; zza{$XJYb%iJ34H z9ln~~Bsgx0X*S3#?`1$revvoArgK3`-Fz&B=ZeItzDkyv4LW0b_PMf6!z4^6dKAT` zmUw`qEQYGPDtwfJalL&1_PKwF+%==YCHl{1ca2)nxz2=zY2S_)x!Vh z|LI*wVLhZ@ne*kWQcO;IpieT_mYOBqc2V z=&YAW*p}XECo-q3q>{czHa5#HAs7EZsK6=lE5nnjbnNtCy8M#rv}+3+z7OBWY*TuK zGEP$nEDf{0_=oD#Kit)W#46)j#G@E9+vpNj8IoiB9O7~lIgI82sX0UuVN5lA3jyU^ z&M8QUe2vL5JB2J5a<1JlR5qsH#{t0wKRF?YrA*7Zew-v_4`M7WlL3rlb~13lWN)Jw z4b#8ml6?^9D)KFe zB{*18);(ifo|7Hi5ZLBFYDSC{U%BowY1hacD))Yr_hK;5vD-PoAaaiWYCbQkWI#ez zTas=MxDv*B4(=YlS00-0Nu@CKpYcWrzL>#hHp%r>ScPhcr0zap%2_x~2Zr=oaz?+I^}f`wEQl+T2jO8r$52ahkwk70RAy-9f-yF)kvo$H zcCeXE_!~s}>?SY8-ZEBDFe(hIG{Q(VB~U2iQ@es*IV;iyJNKq{zU6i4Bmef7)22<7 zIAQqMFx)$n8lUs^{IR{E1U@I^O2iT<4>gu+@qb;i|0NK?K_a}mgYZVdTX4l%X>956 zfkiYOLW%ieuD`fYf{7;^S3)O#@u@%TVsiuwv}hlu1k`~?Q@U(VRca+FaCV$<@d}dW zr`yskS5&4$kDN+(JqQyBTXaS+#noI8I#1k#=sA9YM0+FBte-iCHaHxFP5*+yMA5#3 z>lx5V#)M?nhS)pDh_qY86~kxk zM<_dSf)*S2k*Y9#8!%E@W=C7cWpDB$3D=SksRt0wDf~Mg*`A8G-}g(#B_mas&y2Eh`sllif`X!A2|KQUYbYDccO^VC17aABU778(Uj;hL45;+DKuIDt~f zd}A&7vxKpING&AUe)s)j|D0?vFVErm@~Bj`Lp31%YYr>pvHP-qA^qhMt`F>FOfqF* zsFrUPkOg3F@q-c~@apQ(q*>2Fs`%^6E5l?vKvD4(2rOox`M#y4HH7AVOxdl}{zZ~LVl{X|@-}lSVq8s#GIoPHqDVC5|il6 zP^|>!<{W^Dk*WGsTU*w0Z{P^L?NL_@-n6Z4OCNmyyVFfqzJxKgZYcOEAb1~cyyOth z&*$-+F)l+%K^1`EPrMBzT*=}!5nZLK4ps#7uq=*?=DA9zqMMSIrWJh$+P*ElVhu9? zMQ2VH(T!{EKm{Z>gp%V3+7^b6P}LbCHtd*M6n?cKT2u^ySmW5b{{NL_;PkQe!{%pEn*VfojCJc&5&Uu+>J@Y7?;Z24= zZlX+*cS8yDBHF?QNDT;tT^6zu zWU+?QLCsv?AVLT%lX{9%>D!M`e{g+6+O%ydt>2c??nVe)#Yp<}XNS`90koRHJ8%s= z7H>VmC$q?ag23`wB+R2x7$z=48s@A&Ljfskq$#mAph$mhX3o?%8~caf4i|Z`QA0lXmRb!noAq8)iOgh%zaJ zLc~$#02AZMLSW^)U|hV)HZ$#y`V@rlSHc*44&me2aStXS%tH%e4aqW#fCo)n0W0p| zjPoC#Bl8PpTBV=oOxUL}S}rtjKG)<~gr=BR+z(C1+)sv#O<1iUoW7FkQFN4{cN*KZ1fmF#{umAvCl!t%?#)mJ3_8dVSh| z`He(H!|tfkQc+EZ3S1k7B9hcumjc&{yJ>;y9KgnI1-ARCs3u?utCcX+0#QQ1i}+WL z=C<#m{prpR{34ZLwxpw{PQq|Y)5VuumVWEk?@asm>pZ-3Jr=|dlUH}}aj0O#Y8Z`kaw<=@XW1SFvOaT3S%AN-$xobJB+8!Rn^ z5G|t|iC?@>dJn;ell5_CS~ul()Oy(HAq>gzkX)3!)pC@`7cjTXlTTBgCeqGzRq29u z#^d_C4-BWH-IQPgx6W@RaPNs27ZZp%NC<7m(}bTVTJMnP8@Ynup<<7W!mwzy9p`ND zQ4o?~(x7YXScnPV`G-<^CFj@*9ySro29Yo3FEcb3QD)$r94{(ZpuIE_itWBRcMj#w%!g=2)ltI`)??zKDcx{Vw0K~1NV9p_Rz0S_}%BeWjrPkXj+qfJjw zM8j_0xP^d=BaBT^v8}scyICRWwv}z^FF*Ac>F}A}^rf%dM_I6Q(8%wxW@lk;L}gPL z!REY`XjFAH&MgK{E2;Tf#5x(8-`(9wFd0E4ChNo0RuYl;(ck=ybm@+*!O;7mfdeqt zP3`MLtBhz?VF7NxkPr31=jF(mmaihmhW3pVrESLf-9kV^& zzw?ogq_2GStLcya=s!mAhDB~Ya%Lbw_Aq#%7{7z&LnBBn^lB-l@O@FjOOvD0e#z7@ zn;COgs!0zWpHKInfT_(7Q#Bs#g;239tSE;3!N0)MoUqFr`sto9H`f~k9h#WovAC=d z1@?J_dGI`;ReO>7NR%b&u&2c^>N4^*5#t@{vxR?u5{ea%Z(zeQa5x1Gs zDSoYA%2&=5?(!=@7oYh=C4Bk*Ej;Le= zA4|bmax9`md4>>}7c~-d?&>K|XLpG{TnzRPtA&Zscrc9>jq=O{vcTNrsxr~>5$7+A zwF*r`%P{)^Uj_K81`3q(?BZ)VaM?qPkTR?W`_|Q^y>Gb*I2Wj-k9A z3!>!Y28<01a(PIWbZQ6G!95+AU}E++-<86cFy;}xgycsUYbBKfR;^wg{sqJ1BN`2} zf_MwQqn5+4xbD_lZ%TLk)Xg-A+YSLkav=|=s9+X(rg6DJ-8jp~^9untt3UZ#Na$|3 z?z*%W)5qWZKYyM6-~amGgIG%(Li5sD;DOmnKR^*->`e_MT2^94Mhdn1yppvhvnkBT zQxWlpW&ozS!Al?}(+jjTAu-p4XT_!;b_78HKQ-6rbBQQd7)_?}YjOis#a|B3QAmqF zK}gS+`i8Fwe}v2{f*&{+))D5ag3J~3j#b*dRwAuWOZ;>owTTFJ;2Mdf_i%iJ1pe`J zX9$!+gTVY{^%q0wMn{$A?HdMx0}cT*&X*ZRs}Sy?$;K3;4|!5_*lcYNmDUz0VWOC!;A3naq&9sOz}nyrt7t2s z*%&Y@-IPgR#URrJKCA(H1{rBsNhrH^elyukGHyWfm;<@{3D>0%RW!H!#K(R&ZCTeA z8{UnNym)@Px&1fWjORaIe)Bv*K*8gQj@H(;^zL7JKjpVxoqqebKbj65ek6pS@Qp+* zOUs3ErSoJBKGS<~NIPC}x1C-JZjo%>#< zAhF7iAP)YmY!fF_?g@!{f+`RCXT@Q03H}*GSq_#7bdDy2$t3fF$&Yad2jUzOPMxoP ztqf*xjPU!wV5h+63Gm$jhE%jz-35V5;-r@1VPnM#q6i~^f_s`bHa-}Q2oRhrQ8$FWoCd6Wc4Pj6S#+L06Y!sAp864) zRtTad^~#K8DDGRYRr8P;1+8Em;1nU80SpO;AG{`^!C8D+U2%|7E6#|7!?alqGuEOrf6lBmGUP=cnW z1J*EGB_Q)xH2YNHG_Ao7ZD(XFMe8%`=Z5FEymITXP}y0q?|mfp7SFY-vYOJGHESWx=0&1e!Fe)`1}3%`{tp<@SP&MNGdJOuiwuUDX|~P( z&fz1}gV_i#{^|F&OjH34%zKydqu@~l6OY_1ws8d900+lVt9A{1wtUR|eF&@26!YBl zX9aGkDRG@W%o+%TH$bGj=Nv&96{&@ME2BgqNp!wwCPAB0PK@8&(j4^!%Q(lJuReT= zl?0^KP>G}K>{;@&nlL%jY!;f-(z=#T!qw@WZ+mO{>DRwDa1D?I4&<=?QC^J@6)wK| zd_PFA`%%VvA)fPsVO#=7#K~WMC!*A&MsMG`J=AF(=n@*X4<}m+Y8t7BJSrloth6Ds zv!PpaQ%hWH!s#RqN^@3B$TLS`47C{)4asdrCoafTVwH|$|Ez{|!%JV1?)=rCOB+^F zCs0Y4Wg@=M*=2EcC#z(7a^@1>TGdn zwG>04#RD^B6=KRUW2=csj6FZ9Jn(s>ZSc3a90ZjyWjvbS%o{XnP!p5{Rc51^M?B|` zxWBI+`Cjl|*$VeF~6mWyV;y1@M>3>(hSycelRYXp5M!ieATQbgB7ms zOU-5as0K(iId_gq>M%8<1BI>kLr>*?oDVF_Z8E1!Z7@nBaSspSEPR}sbBNFQ+xu|$ z5CCLWYQ0XV4s)FZdyuN?EkyHaf^49^;`KLNlTMx_XaOxQm{y#R(8~DE!THN{LkPBt z4{PlWW&FZ9dInP4QGcS%HHQe2Fj}t#>rH=84}M3?ax`B&OThyB$JHS;SywP>F(PpH zz_{x8-VpzOn4976(-cXVz|7k~MB%^r^$(@nZoD4+Q<%u+lfgcF<|q2?_e*~=p&{#B ztY7iTu79F2U&x<5rYAnnvs?<;9C?aBNXw&?qdi@X@9P4H&Y@$6)7{_xW*Rtl6g%$0 zbo%ruB*)rx+x0JtjcPLGXFvN{O0>YFU{p$U8`ig{I)XmdZ^V9#6WW5HHnwYOY)Na{ zH>S<>mD#>!b-Hr@6=~Pj4M=Sof7HH^#@O&i5H24tZU{*8WLy%bR(dGC`-Ez|{ z>9_y=M^eY>lMu*Ea+f%nEMsY?Acx?IVaB%Q(6lx>LcL6Kjy&JsAcCROtoAM#hBz#d zu=2ZIV=YP6ak?YJH_o+t_R3XFgd^`w?X8XJ*zwcpyAK~pJ^hpddLr;H5~KVpHA3tQ z{E0;Zf@<)Dnvrx}+HC-nnxq6i{C1enYRDh5UZ7Q8gCT_(B9+B>kk?UU}Y| zVQQ)=Kui76@hL0I3uXL3z}fqRro|@~|8*=6_i$80K~pt&qQJvim_Vi(LV?T+CKSw@ z&*#G=O1U^nflberq__X8_oUB!@{dReE(;p+?XP}4nD*6IU75b~oqNO2t$EjINdrR^ z0MxLmU|3lYjJN}91&3rvl`x+&1R5hyBNCN4np3*KeCL3FIT}-@-7*feOHI)uF9YX$ zg&5aG=*g&UwmT2Z?4)tSl~*#JA_Kp-u^wTdux3-FDk;(LL1rJzkYQ4;VJn3*Aw<6n4w+pBMrX9*>Lw z=oeZ@+qdmVpZJqMOMn0Of1m#HuRodkkd~oTFc=7?Om2~IMs)%Rjm)bN4WWFzoX)n? z%#>j2BY?@FKR|3~#jgwzX=~_OJ5#WqTSt>~XiUiDvvU!RI8%V*sp!w=)8Y=CGJgr70XAqw$L|uzH zYlc2gHe8)&;4)0>5fvA3AaV^2M6;Q_=jJ8{A@nJY=L8asMRQ*<%)-!k328N^EknHv zFlQN~KC=v_j$zP-(g94Ae}<<|VK!T}sx@ufwvXx&6KJ?c`PvpIYJ)NYHBDg6lnsW- z@-x-E7~^qtTHjZ!9ZXEuoky5uIXRfu;@=Fy`Y|9ywu|sBtzFxi*3}b0K^dbDz5jjb zPyh5kr2^G%_P4K2T_jykOwf*m#*Y&`mrPUNo-D&&X|P5#Vg~j(x&Mk4t=@L=$jqtA zEU?>H%UQ}~&ETuEGxZ#T%5bk-5RsFEas?HS6Nw_26|{DS=E$o zzx`HVtywa=jkM{hFfFgk>1aOVAE(#z^!df`P%eZjuvG`HB4O_03ocGaPMk`eU0vx+ z=V=<#txO%KI?|8CNdd-*Lws>4qC#nm+c2A4^~Q@|QDB2I6OAszgjvqPa>L5wZP-6$&b8D2bVf ziU~4?GH~jO%PvjLl=B%TFUFP@He$31Ukz<}3JYT-d~V=;N{2yEM`3I|n2D_VEvc*} z6=V|55t7u=Ru_&BQhmRe{g1~taF&Kz7{G|2~V6ym_20nzT4|7~4TGmVV z@1y&|U^;qY0u3?qC6$%V((|b`U9jf@%ve3?)Tz@jJDX9GV!}^wLVp9B&~|u@NL^m# zBz1&V%do~qiMRwdOgoM+^#PwekRoS}n!?(B&Ju2aP$O?2QGDOH=N_00_4ODx2s_q;vuC?um|sro+t;Oi7w$vg>mmtw zC{0scV;q05Z962^vDbi$uWC}$d7T_T&-1B78Mx zDPh#X&m<9b22M1?1TC*-s5+`G)gvf3g{jWxQMgleU|K~`#K%AW zC#2R4rkB0^mh``VnBc4R>sb^0ZZx=6vo$(T6Q2xg5`a2{LP{e(st)>R$q4mVDa?Qd zXk!-K=6PUU-fxqd6-I@1m<0R^skt~RAWT8X2C4YcKwyAGu$I7t9Xq#Bm#`5m#C!x3 z=%@5gFWQjJNIk-efN#kNKb5KLu6_yaQ@~@!7(sKJr^QMGW=4s58A-fOS&Yq1>E;b- z(h|!JC=l2Gwn=qb-0UyHC!&iy8`CGziny5CJ+Z?dcRjhWZKd`Tl zPQNfnVaHdg0_JTbr-|8Fr(ee7+o~w{K!Ac|6YFm z@rQs!b?LG6Z(HxY|J}cmUU}Q?>GyvBKhPxdK@i7^+$lBDH_7dSwM0xz-UGWhhPYp2ob0Xm=W!ctNE#)$`t1O=sz2W5kTo_i7}QAjU7UZDKDg0BNlt`K+nYES*4VtU0UIB$?YzQun|0x+J<7k%Bw_-TF zmPAcXGShL&Dp>2UjSA$~UUO~uV=OE^K0F!q_4e<-D4oRLH3xIl24=LJj7bLKxN2M0 z2#o6DVFJa!CfnfuBt9Qat}@inV$rtLIP6_zJD_97PeANR^lv6b1r4K$u<^-p&ZPo` z^UYe;12-6fnkNIrIRAq%DVKtQ$h0Cv99Vli{=8fOkuf+{F9A39V3X0=jMhr{5v8ba z4Mrs6^KTiKK@oMBd^c`vClI4N!rTYZj^|lNJ5E@{*hop|X-JF_g@cTzX;8oW5WUwCoDtYnS=nu*Z=`oK`KC;t!*$)U_~XS!&RF$(JYth+xUHYdV1-wY(yRv z-qDUMB3o5sfW}bTv1=3lkp`F&)zI;0babA9IcV0?6s0*x;+^H{Xs)~HiVFy%C*KIo zXOs%&8u~rc002M$NklDvaL0ifXHBRTJuwbA@Zbl6=AaJR` zAL;B&xv8s0&;d@4QHgnVTCI+O)~;TY-v558x!imsFi==P`^N;ieEjGTSY}*5I;@t@ z{0V{pIlHN!I(~ok$xoy&e&N5tG|2r!YPWdm1g5bC{30f^4-5{6CS_4)HIq^5@7Z>J zH?=Km>-9HH5t2Tax(JEy?aQS7NxIKY)2#o}pLSyIFHGiG&tA;8GCq&UC*wO!jm6alcW@4VGMS`LVw{TYPb|#6 zb?2`1(ck)Lx|AB4QPBgOn&O^x-dR5W1rS(fT>k=KEuZ@10|5zeNXrltUoD>-WCo%$ zLSw(b|Lk9;&;QeZi@r!RnCr?2X}6L=G)RQFj#Bfo7%ig+lb7bX>KYSDsS!xi$)-l4 z4e7Ns4e^?XJN1qXq_db8N2bsy@Nrm3mEwn?jYLQ|=A|yQv1&B6a&o1hcWHwDUp)kC zoa^tw)MofJ%!Ij_qokRyl02myJ2zr_qp2g>g$)5$(c5m*#w{?^@tCU`#wc3gFmqkG zqRAX&7}*RFl+6)wTUA*|x88JR`isB#OSC}7V0?K-v8J&_GoegNMuwG-13wl--yjgX zlLym+@J91R0xo9IVjN(cfRYXC+SBH(Thd{2x4MYPQ+Lhk>}AB>1a3S;0Rt~tqd}U2 zr?$Bs!Z%O;)dXdF28k4#Omz@H!J>&S}7mI5^PF*pksw2=@RC4T25f zttiKzGd&twh!Xh(6%%Y(KZj;>;E@C58m$Rm**Lu`rqSpule9osAhByf)N_I@lUccn zo^dcTpTqF`!J%GESZGz<-Qm+x1C-I}tE#K1Onb=-TY+}bNyQ9JWcBqm>6`a_1*V88 zlmuPJ8i&z&zIv3ce$=$|Mad^Z!+_FiCd+Cr%BV0SdjG|MC{2SNry=eq@SEA?*Tmf+ z7`o-!j6j?s^u4+Yq7L)ZyviW)3~DqBp~VIJigEH^)<%?ZxLy(6Y2xw^Ich2j=|ZaQ z6jju6Z=(Fh`ZE6`!!)m|53R7DJiB8Ajnv^gtRh)kf8`V!s<~$)w79X?R#Q_;m{SFS z|N8s-`MaN~%E|RjW=v3KXq6o+Vq|F+1j``I^y1SjuB%U%U3yXa)epQcwYRkbJA+e} zkEa8HWybY%ptpSOixvVI0nD^5dvJZ~6MvBIz3;w|u8ll1f2Rk>esg1e5VA>qA`tsg zI`>ZDgBnMYo`vZc?PqS1)!0|#Z)zb4-gJy<%w!X2YDJic<{-!t>~fhF`BD<#S+q8T zE2@yZuekh*R9;I0E84)=Fj0hPC?9cL0#V+1U~m@@B}%*)`BQW$`por$RAT5A*9Kd*oZ z)YckhFpA3RieQX0z;p!7P^KCFE#|TGFn`YH$?6g={U&>#3n6M-wiJ2kRr@KHy(N9? z{)Y*Kv0>~a5u4Rf0&8TbkL2r9ndXL;CBus9_lxT!lbk|>JO?}tw6O|&DM2Mx9_b-* z+fLDzZyFC%s6i{h8)jsEMgvi1rU|bHJ_|56lfhs6hC9-o?|Uz)5f)Y!GBV-iREp$dk=+R|_AVe%G zGQfa}$7pB>)0)QQH3EZbZ>gtI-{y#3naWkHKh0F!dR>K7#~5WBDnLc@veD`h$TI1W;cAGwMv^bmy)h z^xlqB6Wl9W{SeTB>jnm(Sq@VkjM8=-5@Z`Mc6FU4N{&ds2C6~u4CXw^pbR1i4GS2^ zR1I4v6V)(f)N9wSr6FTOy8pq4DWwF{ zByqc;r7BGhkETZ+K8}FEywPH1K4mZ)Umaf`rU~cHPyN;)lS%MnlE}fjdOeNQP$YuX z01OKh%j~8wy~?;IM>P{txssD6d6u%W284sg^s3jqCjI<7-b!dZ;soPI)qd7t`FMH| zSY}*L4}Qy6zd#|7nQNr6xj7JX7St}xRS@e(4;+LrO{Y(P^3T$P4}3c{qA3~Krsgma zVe7q6QJ7aRt<8z%YnQ+k$iHC_iE$eQx(t8Fkz+@2tmDup>3Do1>!v+9F-KoF{8RLf zGoq~sZLHWZbt3mnKAne=8L@|~pLXrq39%&M7p7vQ>oePf!WNNI6Y@U8gZ!@~^hK zJe`FsuV`KsD_2)X%|d)k^E0&&?`$y*&zI3c(YbU-{3lBBV0=^|1QmPF`CNnc|ob!k4!g+?J+hXLm%0#FTQ>-Oys-pp)h^$PQ{Cee=U;e_Cggg%w}$EH#n z70y@D&&y7-^Ds5PETyu-cfRugk%n{W@X_Ps>eRw?An05Ry`sP~QGxn>Ab!qemdHK{ zuD++W?Q6qdq}Bu1iCTYMm?tgrTV?@Tm<1dKW=Ze}#JvE~tf(nZ+X%BaQV~*{R#2pO zjNpOpjy{Hvv1lSBy3a^KN=?}csJyHtU3c?K(<28DQL%$MgB1-CX_v8|d8%C0q|qUZ z%)+p|n8OwzMr1f*FehLq=Z`*IFfcVNpF=onPMd?s6Z$}a!hAY(qBA{uv@=!H(OgY$ zMSW`oe~c65XuebxjMQs=Uxqnx22(2l3PzD>TrfiJuLh{;P-f-lnp7aTA zT%E7iTPRz>V1OEs6Je6&-Yfop_TB_avh*y^{A0_^h>YCV+Lx}XR=3oPgrpXW5Mq%q zAPzQ*F`LI=z~C`(#^Zrw1_J^cII=B#gl!4TGH2MvgY5x?z=z$&7$h`msioekx@)hj z+}Fs6$k^t2zNpZGIU`w})!oSVR%b?L#EpCZ`$zWw-uL_7@BL;7kvs?s29%+3_!~en2TPEh5TLb{D0DK|HiMesMqlD z+h*bHB5%htj|Jb}Z7yau-rFZkr_@{bbi+RnvJlNK9A$w=3C4mQeXTgA{oR^`@Jg_t z{eALWsQq+quqRdrhM|Z+Adt7X5W9$luz+JI6W2y+YkQ0F(Xt)4hV|`Q+65pZPs8Hw zcpO_W8(_gO-2um5M>|9K1KciqC|5f!Lx8GoMq0FL}O3n6r;I{nz7+ zT;ousf`A1P2m8#SCd}i4vBl>%!gI2^eezyMPz|0qaWehj_kV9Xvk0RV8~xCo&kVcz z6M9JBGvGR;iOdf3;+p{%eiuS5hkp7e{%LxauwIz2^89X##hZn@PCd>9ciG?%Av+Xr z0D+-12vFKbK+vKtYXO!8v7*ihK;wA3C<_~aUn2w*ERldrlknaSuIVGNmypcEqO6Is zmsf}P>DOnd%{F8)Siny>s$?adsvqlT4LcVQ6$BB4M29% z<4@c`={NW@m8t~)o>}!aOjn{R54<+FpAW`8sfsFr=S3j7ZB_wxy zWjnPfgp0+6MIC|?Y|>8S!rU<6CCIm7lLD7DRsy`o)pS^3^PGXbQXJ0tVc>BLY%*3Q z`8KFD-*muSyM=o@U{W2O-3%kO9}BO=WhV7jgz%Y+QKyi>pk5Bs=aAMLhX_<^THmbYac}X)7tF~YQ%JY!0XT&D6X?fcubcE+iZY3gty2WmAYwR zVJaP&nI_+aID&=xB@aB9@{d0q^<7#a^;sY;7B22A*5N>M?9JdR?Dm{*RR zdVM*&)Ws0q=5{;1=RJ?6m(o%B*wN$Znd>*POk#h=T^wQ`YPPu403#Kd7F`Rk=DF;U zJVvr8m#Z=d+z`ONbere&j2GZ#-@zuZ`WZ7M<`#J1b8Y~D{YI0F6%}U*gWSq!2}wR) zka0%9m@r_3Xay~96e0>tSkd+*O8=pzkp*?26b!bzW9q5Iefyh}f zfSz~tEKIsGJo&*7rnmm{A4T1_N<+g17TAO6YgNCV5_oN*IDqpu)1v+nQj@%q_qy}0j93ZF4wXknUl6ruYA>m zX_`XfnzdTghOOxEK+6ob9EpIF<;h0RrkK@^rYgRxL+9PWHDAyLs#b zkF%^RNuNO=Qcj~3^6pR*)oT;J8ywU8l^_9#3Q7%BlwHInlhjRBwMk+eF8p=m=GL*< z1T#R@q43$t_5?7;;_rT0N>G5wS&A@(IKzHnf}h86UpF6%gWq|Nn`7VrJkS38?Rde% zZi8pOVw4)#^Sce?>bVj@f`KjNg++$@2_T@N3&0n=3X51D>S!)9sb_kvHq5E0=FZXWo4kY$)z_G1COfat`t8iPSaCL5OHbR*rgrAPn6j33GA;tpoeA!7Ik;b3B_q_pNx3Qf{bk`l{ z8d8b(8s=4&?mp_R8)pmOCd#;7#o~ez3ZI<@$}uJf6U zA>J4bkp-VvrgFF`l3IGyBK4#;0!+>SHs{|ek!wo|k_H`=*tZueU8MuP@yJIz< zCd+L>!|W9{Le5eQGrT)DKNpr)hIK2YN&w>3tJeq_)9w1@52qjb!5>Jky#M|vdEo9r z0_w1{?Jmzi23&V}g0sUvKQrLs=0g56Z~qC}R=fwb9XSpJ6I&?EN`Mp5o&XqYohIid zSojxNoO|iXC!b=$@1jJb4G9aMD#4Dc4~vh|<3?32I2XRrlBaP?MQ z7p#GtmI1Lj!jY;3buh2v%HE|$sSBg)U;|W!fz%NW2w1o217*>zKwzH9MZE*a8BUXp zbXY`P16`;M*_}Oq8pdee2t^*p+pDi3Fxi2Pp{6TyeDgw_e}_Wi-R3U9fC>&k@gPq; z{&V6H<%}WsmLtSqdp9LgEk2abopie zY)5kR*bxA$L%wZ?c@fqUA=YWsb@!)V{>5L0`EU)`Dw(*7CW>6-L3;zx0BE$hiaF?q zS~me)EvZIFt2{5DSjgRf&1-b5f@}2QbADtwf*2qp%jzo*3BxjQi?^*Q6P&yeaEpBd z=(}x8h|0VD`u)p*K`=EUr&JhPyfo{L1ayX>o2YB-?w96+&QSb_h9|dunj!f54h% z|0bIyw%aHH3EOq}U4SAI7>YGBE*-9?#6qhCUdE*XY-xxE8io@6ugDjzljqvn>0g5) zkiH^NFGZ1t;S<6GuQ@J&4uB371ryG4F@9P%H8tCXsP*{Ve)L9dkJr zoH6olZQdu)%fJK^H6$`H8QT(_jqg8yAswgD;?0}OfMSc@VWa8h#mi}Pc{SWB>dal8 zx$NcQjhw0+%0p!m9aNAS(0T(PhOQ899i<#$6eXWsgS~-hHc)K>LQz!)P{@wV*J**p zu;_=yQbu@KW=2piL>f~RA+M7^G@k~PFqhmYAY9?yd>J}r3_LH;>KYPtVtf!~08ih? zRXip)V1!3!7Py8=x^(3-pJOlm^{@T<^ya_+?P-dhU4|bmOYnMP%kZi{4|n-{23&V} zg0sWlof+`X-gJY)0_D*gYs+-?MG!z!#u|6`I+M$MS}Zhz(9uQw1_?t6M0ORf(`IC6 zcc0oE+iz50E{G~rlmSM0T2R!Hi`Up^-zI=;s@DWS7gE+rjt>I?ct&xqm|dL4LTEXd z$@QBz0t7U)HJ{a1p2uDI0cu61^+O0b+7#02DJYXrl5XL%ZV!9m1dk*i5d>(FdZ0;k zFec=sby6@clq3y6cVi94#&rkiv3M5E)v$?MtkZ4uaUiCl`-xycfOB{!v}pb>om7dcy#yS23uCRVb#gi1^Rm{{$?D=VX#&Z(Waio9L~Ea9xG$hX?A*%&ldp+S6O5Z zRV4P=UL{?*ah;;>R+?L!OJ!~xp1roj^%m3r`uDyy{oQZ>wlvDv2ZEqKKlbeRyFUXN zaNYem&dzWbX28UGi@WmQde^U~d(NIoKlYY?8cBXzbmUp2%+t8=d53N;tHr{+gD7E( zf?&TatLgwMHZZiaFv@9^aR6R}5Eja`Dh?Ao9zc#zAujE0z-RH;LK>f)Kgi|k3Yim1REE2)k4NN$}dc19o~<6*HDT)@g;GW{z+fFaOvO`~Isp9S7pH(fa% zIR60SM5a$Uz%!ShWS<=Vj#KG#UiZ56i~shQK^hnnXqsc369`fa+sT3zbyzdi1o#Bt z5V^!??tJ5B12P>B`yI};U)#X}V?LcabpmIRjdb3cn=9Nq7ZU5q}X>I97 z+Fr-_v`7yq@>5O34khlM>nzx|qOY^)^ME89^37UlYwon2Nlay~a_o@8?pg7(x#mn|vYSbw_CRbD=m!@=j3*Z|Dfl2_H z`6lap1PC23EH>5`PX}?$dQJWtozsYxoj4aj#(T#BoW0d8#!SA9u;Vo1fQ_w9TD~{> zjvky(F^Azsvr$5iYq1Rz`?;PzOKKuR-`XbJMl(d!jxy6~b%MPSZA55G*c0!2y+FphV6Vg}Iivmq48dxI*)i0*vjSb8<;q^@JUxV*8s9^t-4LXw~U zs#m~*uBGcsYcaka`x*+g4y?!Hz+6~Y4}r_V=bW)quLGuNc#k`gICt3&#B3{cE#Ba! zMsdgd@sqX~i&fSxK=50To?z{IwAMCjyiMe2YGSG^td)~ig!1cUOd3M52W(IUi zw=b2h5dY~v|EKhS{+oXdaBPKR#6D}#E)1l=5B8w4`)-HDu10uGCk$?=NvdNk%VOwV zH>+VR*fN(evt?gvv0nH3SBE2lc@u~Z`;pH=_|Ps=bV`VDxyK?1Q<&m>I|m93?1KfP zAvZR{!Y{koA{?jtdIKPG5e?fSfkM><;5EWEQ~-*D7za;QaX3$ zG`S*xgV3j~IvUiV6#>>fM!&J~9&4G3u)EQ*Lc0G|52WSWYw3wgml$r}&Z&$ux_*Ou zTel+DQ`-YHp{xb$E1vk!2h+=FnyKGl83SKcnqzzh@BIDW4In*+d|&y0xjaq$600QS z?yK}3+w20ygb)qwDR<8S2DWDL=0T>(CmsKoKwgtKi*2$bdTWs{yIn1$d+xaqA$Y)l@5#EqrB2O8J85fO+g3qK3`(4E0VuxJTm1jPL%@%HhT*%K8sw6F)s2O%c%CuQH8q%A;KPl0>gFVsKd;+Yy)&# zn63&eCfJW1J(1Qocfy2rpAe*VMe8Ws1WaG=xR|m~n-6Ms@Wi9vQ;t-W;s$gf!Kl2; zSHxsg2xL%!N5Uw=UNJ zRK?G-Jyv2a!t#Kz2&X-~ZUvw9CF$3heS3V?F&n|$v_=AH8o3-@<_S`h??6hk+F#(7Gsuqn4bhdRbq5P zhSiPJ6!HAo`^Y&x9i5I1c{Y$e>f@)NLSCjoAvVVBrg7}T{34S53IMQ|?tRHi(xZ<( z4nSAZnX_lp^vFb-pPxvNVHdT#^JqGM`rh<1+R*Fgw1lPBQ;+{Cpf`a8{v|l#m(m~o zmt`=q5R!CdEw=txWd3&xsd-)RY zL%|6{t&Gp4`P0YK5B=cxrPsgeRSccH9!Oc@CP=2o8RPufw-?6@WWe>}_#CoPe4H6j zId&V_^*${|4AHq*85!E6uBwY25i4;V!H}VaxSHL%h`E#P>fNl zE5g?HCX8&HbF7mCVbSD{-!}0o&16#UpYyJr1=!-#ecZrZK!Ltkpob{-mHqg-BPlb! zhaS40g_y7$yR>TE^vD18Pr~&=bKX7jWR+p=@~LrZ-&IO7|L(&HbXIb|Ybwvg7BZ>QDUmtjz_ zNZ4)z2aeGqeZh)=-0`F7u}A+bRfjMGMs^RKO!waR%Cxa`m18{4sQ?1=OdG=esSCSpSziD7UywfIkxxti_rLv>^u%M2F&66LB#3NX{s#8wDqY2HX#`LO z`hwy1J88*E`%V`sKPSegQ(-a>i!FyB`u06>MdDho*%r^meOl!h|B91u%5UfwbBv z^?DY&vRK2YM4URnWyq;#xXOd@pP{%Si?4U?!`#tZL~9OA)VY4`3g_Umu&i>lQ77#{Erzu*W)L7&dEKE~)yf9Hq*H$-hxe`(V4!DWM zy@u$V9+~Jk9*7mLsYYEHM^7bQ*kK&AM~l-)IGI_Yu zID+)rr8F`{2zIDK3y~Y?>8CEDcBEhz#>-i#=XxS7Ed!oGS^x{eyQ))i0H|JsCCq;( zXcc2FZ69W3pR+f9?&qW*{{HVrc3w(<{foaSeb@K=K>EW!{Jm79z}nikPRlX~K1;%b zO+NQ2a%tR|p#I$SuLVmj-Q1CC@>%I{Vq?o2H*WA5_W|44lHE??^#00Me|mcB4}DKM z22h7%2!CRF6%MwK{4{tbdwij1AOo%!`V+{`{};}HhPlegb(ZK54to2){L%DZ-~Aqh z5P}Jy1CHFhxrSI^lEsf2D*&RO>}Mrr3y(YQ=*1c$h_UIK;az?(C__$wglxz=>p&!S zw1r0*C7$7>xWi|GW$lIaSg>ka_5-^7PKVmhu$!z-24jOt@7#9?L#|U}wFL-WzPS`R ztSXxNI!w=enK_y&d6})+Mp}Jp3*{qs^aw3-usj71GA?srj2Z?;-j4GHlY>!}VQ3u| zXZ;Mh2%y_g=|M2BT#=fig$bNHXw$+%ZEF!1?HvRv>o|&d&9a;hsy~ai-8@fpI%e$F zhTU3Prp*g&I(#3wsXdrsVSO!)!)kVPAmQAvc*ER8ZTwPmA*QwPqqc%)e;Ek5O z%<8B+7YGaDPss5bVVc{QqtD_8*`z+qJfQYg0+)4K!L zy|_Q0|6xa$2T@#lcQ9`KXFvKw>Egxr@*Av!HTM8CYO$!>dR}Iuamw!j^}c@-H~DB9wiWC>Lq%xMJB8mHhiZ#WImnwZeB9M_Acro4OU#PK5tCe9G1 zqL|l^B#XJ5&I^Y0CZ}e|q3yvww0UabkiLT%E;doz>2DD_1G{)%n-C&}#7M=v2rLBY z13;_qt=Bi8RVJ@jVY|&Nkf#fF$KpChj%WknL<4Y&r8s~N;J~WLp%idNXRYQnKozjv zH8cu%ndkHPhUMbgB(7Y$ps0-gfPCHR${GNMpaBuZ$|@aw3EN%Am#>?rd;oyG^5i8N zR^AM8p04jBW!s0C!`tUEm%jdQepUK~U-)H|k(;!E8I2o)0_QBkhGlhjmJZP3=PvVG zA>TMj&S{9yWP=#sIM?=V-||iA8@~2yA*hVYzX8T(7_$T8ef{fSmp=2gucfg1bb7~6 z{Uo4_`#XSKFo(vqx}Q1BGEA#$?uysG^_#zmaO11u8m&d^0^Gmx&i|PH;7|TIz3Gi_ zNZ;@^UmYy|qXEmmoeaF<&-z9C4NEmXrEJS);6*kA_Oudle(ERQmVW=Ye}na@OBj%# zA$QC*SW6hCGG+~Ob)`4}(FV;8y%Yh?P?$_eVSu?O^Hq^salwv1`@x^S!M{R;`zjQo zmH`1<$CoT_^_(26wg<%{1f^QfT+sZ&k;s>Md~;-WOt$9B!q!#tWb;QW>G=E%bxznb zA9tt{6SWqig%@>G^Z#QWYhg3Oqxsc4fY~ybU-ASb~>dCBly|RKQf$6{fU22lS$} zD<`xZv~t;HV5lcyp&OgaVRcmCyaN1@Q%5<^$#ml?ZY5YeO%okagL~?rZePcjzc-Si?7N&@9G5-@0Oz=m*2z74s;OMY^W$OSorFD0~}ez zf|0TCS*Yu#utRUa5u7UgS()`NwMYV>3!@9)B*1fmBGt8(jmQPn4C}eD^O`xU38dAt z_#j%Syhqy(i;km{F#E`S+|T2LTLoh>v==PV!MNG)ihnu1{Qzx77xh`riynC`&apvF zlT53L+xrM?%@){~c0onW$3%d48ts1!_hNj~MFXJA8bI25K=>Sow2N-c!8RzCUeZoYWJD0(M z15i>AHcKvxi+~m3Qh^DtnaUpW`S1FBe9tU@BG1k z4#|BLHRa;MVtV8?uTEd}#cxCfIUiv3(QK-J^z8dz_8G{4>o5B!_$fMm*~I$#O8TF_ z{qF!AI3MH=P@DDA*wh@0BMEvI$p9Z0eHKX>1^KR#9= z>_#syLaFl$lVKj*L~)tp`l^5!+$OE^+KuIPzyfgLow_|3!UX0c45~Z(%O8Ac0EwVe zB)|0d6BnZZx#hfZ9^K@f%ElgU9)Pdz7qU|&^ZNjwtgVPQ;mGh5c`outsQqG$W}yHU zf!;n_#k?$#8w##_7|SQ~mnHIuM`?He^Z(`@w7p+oe1vbgxQ_=~oPhoMHv+P^wY5!z zHZ6LeO~ZbfBfu5@^x@-tBFFQX+4h%b2K+xE+p-yW(anI1jlHu}hi$^VHmTV;d-fd8 z6g3tmYo}mLfRBvD98K8xa5pbH2{^+f?jt$RLg-=`K6PBB$Cag-)UP*3!su2B_<@D3 zJkOn6KeXrq3V3!q^~g{8J`0|Qk+~bDG~chetaegeLRy}mWtlUWO){h=1IeX#zvn&R z#t_Hhc%c#z{M@h4uy{8=_W@N*i-wuJYLk z>dcP?!UE2H7tTd^aEhFwo8$TK*$ne>IJ^-jA}r~<`IunP{rs56@_OAe@QP{pl=+qc z*Qd-!`KfmyhQCH}W7yu=qUY2oZV4Kwvh1?}yI{MSg9#?WVy<#d5Oa~zKTjrez+&w0 zn(WGOT(tdNHQOj^IYWvXtL`A2utuyeuf}ke^N2ID29N8SDmb+WyHO5g#)Ob%7jeNH z>brWd5$m72gfxr90bQV5C>;e*^ItL#|EU6Wyd6MI@bp?-uvPa7NUpOoqYg?#0rJfG zQ>h9ljgW)VCEa~xV@pdE&|);pE@9X^KQji%BywF-sPziz$)~P_+eaA}46j9Iq%gxg zkggSmEA{YOM}ep8UZIDD)LKHxzIq%Zx-kE97%EjcCOJlWnH4#Q zal~F%pDc4melnd9VrZaS9mU9ae2#JO0^llWJ@T4I(szExcM{rM2nNfC5}%9j^cp`N z(DW!Vhz`YodxsEc9+t&L#OGuj)?*BgGkEma+4iY10~v6AYJ85La#!KPWpV1lu_Nim zt*b14;~`IvFdvJ*oBId?y0RP2(r?euU>NBd+5%+ETe;AiCofLhV>(EGp}^Q5p7*AB$t{p&;BRCk40STKnvSbRF&+Eatq| zf@i@+zr#XlEN!kKmmkNd);c!EbmQt0BO*KqDD`lk2x&eHNw!vjL7h2qjOS0L-~Z$H z0La`(5F(vGNm(fHnZOKXi5d!P&P!hwKDWtKom)(Gj#1+MT4cTHO>auy`OSZm+}f%5 zEF6(H9E0uSftLH3uXB^<20M)3`rm8?<2E?X;IaQ|_We^~1~TCKRQMD>1+T$e)6Ui^ zet5U2EuxJGtu3sBG6d!}$cOl|fYoME_Re~1XFKfzBK_JbmPDl36UgQxM?}c%+Os!U zm~$-r0-@p#+}^QhQfXH~JTNmi1DFk`ZR)YM0WphPgGKP&P@JL3GKeq@!?B-~-h88@ zrBrQJFyMuS(LAz;K`R6%Ky7@y!oJhA^r)iP>o-Ph&_m_Dk3P-;6@nDg{rA5l?IZpW zEl!*`LJ7bwAwrdZ`>@U30M{bDu39YqI(jH7vBgM*79)H6JHg_Vpbw#f3?Dxv@CRI* z?ji~y>h)T%P3Kgg6fTF!drbkpbsRj_);5AYZSC+rKv!m|2t)Sg7-cr*!}M0H!hp8` z#v>R5FDN0otUpSxs(Lem|^ir&%Ml8-| z|BwD0Ia{`6Gw=z`Kn7f&&@^Q`J>N4>qh{)df8hJlDhy<7W+8w}cB9>sTaJQN7hx0e ze(9vK3E1r5fNm&CH}e^4gvQ6F04EuMtRY8D)mr4RtSLHw9;q}p=Z4PQXPbq)L~-mC z;kIg3!`ZF0NPMZol)bEmnsZJaKi z!S@e_3F{HG23tTJ;KHpzgc=vId#Vv$R9$#P7Y$rMWSLgnX=ZCVLeDv3Or6dy^M#r4 z>_U1e)>Gf~O@AxB{7G_wIm2)H)!tH!R*=8Y(Vg%X9;= zz(|0ZU?2b**&0JazC+E`)@m({O%Id%nGUwF2H0)VfHCU9IDtj9t2`bMcAKXy#_TMu zF}7FZT${+(^Mw3HIlhl}*xjYjcnXF#g1Vu|*gT&-rR@LIfw5h`el^XFAECctp66~O zbKiy4)DTKc0;t^(LLAg!T;zz%k-0e~JJ?;>V@mmY8}CHx)C6%uc!HId@gap5yW$;v zhG%~7%&C*)r}hBJV!Ckt-t@tXm!rU1aY}4}m_MohE7E&QHxb1aJ(!cnEaUb*Ia#LF z$|eF0@@O32@ST0h1bGN-8Xlib=U;MfddI*1SJ+T7-wfK2prn5?1vJyty34`4~;Pn18eZ_pT#=M8gpA}OC> zOtf2PaVBja45x!&LJ>y?$@By=^78r9(fYkk9xPU87E$ekawYRM*fG&e@L&fQ48mec z-cKGsP7TsVS|K#1BYX#N*xMCEtZj0PS`*O&3lWLHVs5Lphv#2wJx#)FIxvjuHJ-zE2nB2?}wy0n7EZr(tJR@^ihki*I4)fMR7{Pv{ChNu!cu1;BC7C0~0NlVXtrP>8MI8kz zBOL1h6(tcu&e=}$Gsn0gsKgkC+K5qb+_fmXXp5DSM#2;@qc+4~BUNy~c-5yplD_&Y zzbt*;XS|wRUEh_3WL*_O?~CouyVaD5V!mc8Zf&w$~wHb68=eyc^XtPLAg z1)6V(b`yZd7I__2d&@ExC2nk!laqZJHfy47+yyL`d70M%c1Grmwvdb0$ntBn)bf&>cA@ayM&hw+YL2Y4dT01-<}yZ2(#@8k$SW)>iTI(4A4N4xCO9|lN-v@%~Ca9o$kvDIDD@FsA5k=;lV+TgqPzUAw3=66;qr!eTMnq#D-MK z8P)+xjeS*O61WS-)VedDh8iQ6hgH(n_ByOlL*ZiFDA?*zaf^*B%ShU*0Ivd&ANjE# zNuU2&uZbH93&682n}Nfgfeg3~dq%V49m)*odXU4FVTkU%`y1;lv^Gv;spQL$lg!M; zyv{?^_8?;+Xfk7et^jai~fj`RGb>_`P zo~WDR*j`1GADAH|tI5vIgESN|hxpbW>srgG$iT>KS5D8(P8MTbVg`*lKhuor8Y z@{CiNd2twq1G7+4>VQ#xi zs}OQec43~z^`b`u#Rj!sU8vmfa5ddpUJdhNL#6r>2CyRu*_O?~;m*L|uj_D+ znjI~hf#)~_Cr+Gz-JGHr_a>qN)r7da!zyGmF7UFW5G%kMe62tTY=}^nEk~Zcd^vJm zH*Q{q9qjVD3q4^*e_$Id?&g|4dh>a|+`>>7>ADQZ;9OWl;ees)4yQi60n2F-t0hGl zD=X`S=m0oCio&tTD~%!#pFc7eeX6YO+C_=Dy{Vu9b6|cSf^`XTc|)I`@{UB@ApxtA zdvXkJF(iO@nC6UvSB#PVT|`O&UE7(Un$(p70ORTa<9?Gxb9Cd?8Nz`DoZII(CJb^F z0Ofsca#kDE$t~Spjcf2C%~{E4-3oMc9;p=5aa5T01k=T2er`4zNook(004LQcBzq@ zOrQD4s{^#OU^;jHe9UzmB>R@lz+IXF|DVjZYzAI*GoUro`STY(W?bQ<9*a34HW-pk z90e`IX^IB?eH8h;^;uQwrHI zjR@U*RLs$DodTnQ1?ufLw=hRrjX6|$7Ss~T1V{xi!-Ped690#pR~o}7N(YR}2u%<9 zXNtC>kHt`_xdJG3NO;bwqqgJC&OI(xWj4W&ZR-d16! z#dBf5MSe@bb@N&Uv=(6aPu~2)>Cs0Y^@3vjGT3a(X5enlK*qT4=Imz2eoiy+z{_5m ze)Biq6^mr}=K&r9OADE{l5H1v!ECUFTL!>ku4j9Dlf}3nI+GP?>?&yae#3(*;rNlw zV|f48i^hfml*PcK$i~fy8LqRTVXM_I!fg_|Q|dldm|`&}1cx|bc7B$;R6gClwG8tL zBtT8L#iHMZnW1dNbzS_^ons6K4dv;E9~DG61esTaD&uE<7p&OV9F(C`g%_i=NjXU# z$uOdTymXVIXdKvw%Y}6Q!YPCywqh}_B&YyBoZF7VThyQBHVAd{-iYzRv`(Eph70^{ z=7&zi9J@)_Q1En%{F!A1cqQ)9&3I?K24lnK>dshXp57?vhghe(aSxDHivO+O`mO1= zfBU!7%nbd)KJt;oF|%*k3>@|hWWaUUGnyUmP-dV@PUZ;;kZoTP7DTMb3NX5WmLQ-Y z19=0W(_iR4X_?$sw}YEHYp{jH`V8u{;bK2%Wj`PTf}TJoyS_z2DnNf zK$Gxb6LZu%@N)22&njCv|!#-d%XC!P` zlxZPN?~xnIF^B^j7ytl307*naRHhyw!>*>ZOcyLVKf(?zKWoN zzFCAvkKnX1X`L4==hX2NfW=a}vDD&q01PHZyJ7?)3PSD(G;j(T8ylmTd7C=1W?J7~ zL%NP217JPim=;3!U}WxHRgTZKYn$bKSkP<-V%;}3H@C5dVv+%~m9_P_8NjaB51=32 zgn)JOfH`yW(?9uB>AS!CyJJqoE~pxo9FR_`Wgxpr2ra9R4*M}IGRfIrn-6k1`MqoIk;_lhY64s5LT6B zk)QJb7v;pbPYlzLau!j9#k(|D1ZdjG{tH}R9x%1Qy4~3#mxLg~iv*A@0q}UX899I{ zv1b_hmYo;Q(FJss+neXICau-F7Vm2^o}m%ujXCpJQMe7!JmAJ)82c>c@-jVvz3*gi ze=eIy)^PsV<`p$4)=+o`;m5n*{io>zA9yT1^dNG0j^}6d(cty* zK7;J_Yz98j8OVU^6P>ASzvp!ZHfYe;VqtdSW1Zyg-hdjbD!=Q95r9P~P-R`;{oUtb zU#RaITeKzNH5Xks)r22!bI~6-l(XKFAM%Zw(Uu662`ps_b@$T(^<_tbmF&ZAbfZVv z2MaPE*23;-fv{nopP#*TJAg~Md!1aEZAm&fPV7(s4TTCzB*SjHx!YD`2O0keHB}sr zoLn=GJ25q#u3WnXSYSAOM+hNUn2X!1(?bmQG(@9EL#K*E+I(36?VMS|h9ELRkTSh> zLYF$yw|m?45UU296&;9(f+? zmvnK+v3M(F=n~?y=vQ!Y)3F`=2nMEf+~$UR0L&mnC9s4|l0fwTvkheN?$USR@VLn1 zp&%ORy7hq&=7bg05FLNr46$un2gPD;kE=XmTcE2i(1XX|jbLka*c(uib{l))^(PEy zUzNwRsfB587tor;rfQF{UlkFDz@-S}pe;xpP=sBEMK)0Y-i9^d7YO6JapNYy1Y1Jw zrwhl*vOw7vbqGqT6*sr3Tk~h;YSl0wfSIs)stbCs#RwGgVvBQW09>VjdI(|0?BoPY zvWr3P6xVcL`rzYFv5$D$7pfRuByz|c%PKo*Y7UDnijWVQwe-jT<&V>oPhLt#j?MyR z{W%(Z7BOMjw`>LuVFohbI)q8g4srN1FoUc3sS{@r2^b6`=OfPowCrwc{^bBbim+a! zr2sM>TNK-NwJpNqFI0OW-jE}BjE^9f?~{4R)>Q2&rc<YN+nCt4ZQHhOOl(Y?OzdRBNhUTY_%q-6 zZ_c^tr?20=ch#y@wN}+Fe{HJJsE4?t1_6*VWlY7{oaD1wERvk|F}Ue)K5&99S^wp5 zAcKQM^6|ZMWRY}{Y2|q^Skn6qj2nePz-?sG`c|iqapboKPbWJsnPYtV3jq*qbwvTu z-ArazUVmVS$j9m)2>!LqbRENNfX(G_yvbzR?qbZf}$UI0F%Y{vlcWMTtcbsbl$cda_(4BpRS-#KH zt3I1!_Z8WX{zdl8?^*a~bLK+j57)zp6*d|L@0BKxR_QTCax!Lxaz92i-HLn%RySB+ zIo2~biNLV>w_c7&E=0~LJR4ykBOkaNb~vDwgih%jPsBAz98BTU>J%xQA}oOtXJ=eP zcX+vSJpg@XFo{2oFQ;nWk;DJXWl)aj#wp%8i=x$@R{qQ zM+jqJk?R#TT?tOsuxbOQ8vDnZ+VBH`J((EF@Nu5FM;n12kBI5xkv*kYXo&e59v-6A z!It2S>k;o^Okqxc7MP(J<5Al1AZy#)@-5ufD8#s>>+SAVU<^mufah=wOJ7oRIVYBZ zh7~qBEt!V*d&RMeYt{uZbPvOb#31!)(Z>r%i^9)<%RK^CUTqH0SuY5%a*e)IHRNH4l^BFMxvr`bWE{e;FY*+Wr+MD{u|^gglxu5EaC!)UDAj6WPks0Ue2UH=yrCj6d+ zb5t2EYRyl}uu-_|y|VU-Wrst4JGnEL7{hLJd2?+ZVF0`@-6_PQz$8XeWY0oiQr+HHm^XaukbZK_7Dx*_{W zx5kbNe|@m=*kdi@(gO|f@!^R$IFH-|ReQik!ckxWb+!u{a24?`^dM!$$-Yf;dMjGd zSq6FfH@6z%P%I)f;bfh>e}Zj~KygFGsCUd2PETfkJ^2qHL?Gziu(qKu=J|EQ{*#C3 zWiFj3&iX;P+A2+W%=SJd^AfLui8{F`w-RA7ZbBVQpqT=~j43x8nB;xUx#^8P` z*igiLpARHj1PTcW5MgC>^9|4e^GqYrfx6qI76m>R-x*o^D>i?a?MjVc9}*@mX8Zu2 za-&ES0-DZ6$tPms9B2IRgxy}Fa*1O%^rne>*3di~b8jXLmw)XU4P6>I-Jt0a=BM|X z`S;}?)By?Ce^j(7+8+-83MTsBd3*wFD&Jcq;59$ZNf^R8&2%_GBUnK_K0E|+L(C*6 z%y%2j2bfX}o^}EP#_Qo*vHPNXVpC(}A&6OTUm7(;@S1wWVgDNC$DkX?lKC^ak7g7J zC9H$5xvpMk5{Moh&Ayu$Ux;BTb(3;xiH0IblZz9~JmDsvBNok?dMY@6AHI3^WFIx1 ztyj=NV9m|LC1p7-S82S3x;AD7sg~KJ(pZr4`D<(JHK-eWj~(cz#`co2Y*X~ zngN*_$9B$DuYxvAr}oyD!zX*oU=SRc0qt$CwE5on@~7$Ke&H`;>3Zh~6PvpAjzwSG zeZbrKtXRI>Q zh{(3XQxO&ryFGB&*tTz6T%}xH_|Q~#3meFFEDMV zTL~8?Mu~hHel5iH&~b*T|M%?C99~32mR>-~V>3ccaO^fu^Ll4hi^PQ%qIZ{c)%sG?-)sI{`PnaN z`u%gnN8}j_R(F*y5o1NNqm#g`x4*y?=~-2Hv8tKT``6O#Me8pw!KxXS@65oM?yiy0fPn+Z%VuR_m}PskT1{(%D6Ek2VxL^d-2L z8A5Sa^SpTrQtAh;E0Mll*^6YTWzH8Nw;)Op~0)*vn0eQda*W3HbUM#!b zKUFjFckQPK3O5^wzmJ4@IWvbpLIH2PpG#Wj4Taf`f6u}@b6z;@hVdovW`&$K4OlnF zGBjGE+eL%)d8NpB{(D!^Qse%g5G*#r}<4I&H!*skW zVr=;2nQ&epW|R_q z0y7kk2bU-dkD(r7#g4!Pe{@dTD1L13;==vD@NfFmqyJrJfoVUfsAw|p&Kz+aj_(Qk z&yI}1(}Ahv*PEQP7+_y%kj-Ft&;o_+5%6V5WEf~J|M276;}`M9fX5wmsY#|q+5gc# zPCD|v{%^odfp378A{5{0`y9?#!rNNjQtpPHQ_(gvcUFh9U; z%@Tyl#3ap87Sk5L;q(Wh@2+Uz1l{Z`h>+j12`IaM4#=_AQb5W5I*sc}Qmx0Ih%`l) zn8lNP7mJ0gMM|qxXMsF!ABfM?@=veygaRc*-=%ju@2M_Te=MS7yAQ#EWrB4*tx!7)$ z)YcpF*w!N)MKmw`Ts(rbD7RQ}cpuw=aWnlKB}T~e`{GiR%y$_-`k$2$^6<%Wf)xEB zOtpze4e9-!iy}yO4udOQb;63`FN4#PA2s!h@K@OJ4KqxsoZu+kva}*O6062;xXNW+ zLLs$E>6PLcfl0?^dLi;<#-R{t>#C-gutj(~Uildf}7xu!PS*L+L=zUvmq&Y=79_eT)CjOz=I2&Dr|BP`Cpx4@vlzF^_q@%9%tPJIj3OSep>juhzI-51Z#qf9%86^ zYq73jC~tso2{j|`NjSpaY}>p|qpPs~f(gW)oJ5TxfDT*;p{Ir?11@f3l|lvjsqd=|dU zLV72gd=6CeTdHgehjjDjD5dklJ4ZQPrnPmo|=+(DV6Kh~H7V?<*yX8g$p z0rLGmdr+(g7*ikEaxHqc}**=<7&G#6Fir(R5N2`5=zH8G#(^HgG-MRG}0qfWz5%6!C)y(7IczM!eBX zU_$GWe@{>~0a$LWfsJ5}e)qer0@3jkfpYWKhVc!RC2`xzsO4-d!JFVloWl_W?cm=} zZn{~X362{PS5g!Ok`$6+x}NVBzmytKcY8iiiP8Da*f}iq_4cJBq%kdQRTcE{HdqQu z=o08=LiE6qBEyW}`?#DbCMv*BK3v8I;!cltf~cN6J+oJv&>L;5j9gSqm~s44KWB?q z*rTh^o1QP*_XydZ=NYq+W$3y0Ej_}42lXZUNqJ1fx;h$kFzRzoM*wsY+}}gfzF4ow z&g@JqaD*7E2;5jk-viu*DShXlou2)FwC}a~fZ+Cj!>fXz6^eN>7FXQ3g=Mm#o#jyI zzp%Xy-Gi0aCpvIv5G7lA_6v$Z+M#f7E%PHk4F#PkKbpp2aYAOmxno^`oWhdk#gp@l zaUSR_p1OLZ-sd&DC31F)mp>J>H#HHRf)BLx`_jJTFZ_e|V3{ljKt!U5vM(?3r~O)H zn$z9tphXDc&dPQaX|7`b;Iw&WvSYK;Zs!w@yfg`K#JhbSp0{6nZ%AUuFyHn!=t=H09&f@65$l*) zolF}06Mo>68v*+zgljQW{D5)3q?bejr)pg4Wn5VhIc|@NOFr)opSxF!ny88J=6Dt3 zeP8d8>OcDyITQE9Zhp{kgq`P6MmVEUrp`PPxB;Z1*s;GaNUDMS!KvcIIXXJZR63?j z@CSNpX$c`SjYT;|LfiA(p>XZ~{2B3gdf8I(g%r6694cb<41E)kTTg)|5)Dkw-;O-s zOc=I%!fx%86F1*vW^!r~gi%2ef*MIAN8_o#NMBRQNZYkP#fwUcHBftFS0DcBtY-PbCs zY`UkMwzcdY3sgg)RaxAcFau`%*go2rE2LvfwP$}TtdsTt5Z&W9gaNN4&Tq~OrCQQAtNXHZVh_cJ*RDefw{6KffGD(jcEoBJ26wjXqbxg{<;(Z~ z^!N<)+H)ak&-mX2Q~lStX0uoNYR^#;lvUHvFpV=YL?U!24kCeCQ|BKY#WL%kNV=JG zU6_WPP_Pn}*9e;`mvtkmk@SX6;Ww_noTi=^lMmw-@K(_^&8a zH?IW8emf;sV_y5cCkx*-LgHqKQY#BF3Jy1yen@3kelrr(bJnvt(VDiReG}m3CQ!iC zk8xL|fl8}^HN71S{F<%|0P=a5>!=mjPCSzRR7E6?)_De-EMEJZbpVxWGTw z9)>S&iLuigBk0O?Gxb3M5q>cN4Dl;T{f&t^uPLz9S%iBASYx+7 zo(RbqEYlq09$AF1*EBN%;F^geGYm}(_hCl2vVkV3-*w6N<;hO>Qlyw0_!}TV!f<*k z(U_r9Wd_W=RkG|dGvz5sx1hkAhOZG~ULRX+s=#=$aYX(Ey7q)bJ6OBpAd8dAAN+0a z)+kYk2{r}B1O(G1qr9LBvMPwU=$H0|_nBwQAT{;XDLa6{qK?87^C;-u_@RCC{dr*$ z7+b-Yu%{@F8?6k78152vb8y8GgiN;AEd%U10UfrQzy4sp!$IjDnS62D`2@wR&g=DqZ{Po@7xcAp z(O=9F=72gY+rCV@sEi&9fWHfsi!OyW-|W!IZH} zmlZpa0`4OO{TzD}{)Yp>k2a}>5iqlz{~J~OJER4^NjW?RGeXdXD>tTT9V)l%{pREg zR*4S~_fOA8n}E%VLrJEoJY}1@fLyzbRsH10&@cPF=QeJvn5GKQp&s*b%N$Ttq9{T# zb#;YmkFg4z#zO@k{HC*PHSUS@LPbo07-Fq__Duo2QM9*9Bm%`aDslSmo2=3vY`zr2 zL>mc!l*m(QjHMbl4GeGVAsohP&#bVE`in|V2lRa*VAs}F&1lN}PKs_p13Nd^2c5E6 zk?+lt#~Xl>@#0g~La{D+AXxOj3t(dlaHPl7+DUColK zXyQ8~=lnixly?0aYIi%dt_@hCYajWPzQ6@ZOI2Y3Yk^YlVhSdSsA-;ae8)5iQtJ}w z^!}^hjT&OimnEF3%mufDL6N%o5uH<9<=I|jH z515=|ljeeYlqY5pzYv&V&Jp{H9@!>SW1B#D?W0mSK{a29`NyeKs|HKV66s;2I@4NG z{M`q^g^1?(1L-%Ih9TxLW8DTFIJgj8`-9(}VG->ND*LoodgzHYLaN@)$ z@n(Uu@r}bK81dSwH47*}n^afqsbjo5iH|4IC5rcf*e;Wb3l4uZhOMFV=HP51afFl^ z)@TWMI`I#47uvk;W3H?15kpK?!$1#bXBgOO(%7nO2ECrlHVzKau7Hm%>0h9Xq(89k z2E_R8rp4*9Ik*@mxQ?_&c|;?Q@rMH9csNvbyNlDD>fMZCMkgQQzX7P-ca9%&WZOG1 zhGL~IBPLxPM)ysi!mT>k{^hdif4Pjwf|YkguK*}KdcB0{zh@xr5b#&=7j(jd<$FbBr!71K`B4Sq%l?*HgT%d@R zS5TI)w%~}-H{(E}o-{oPPI$qbv`VH1`-{t8vZ?>^|#Ahr%_}CYO4)cdm9J;#={5# z<8_dVvqL;~U(cXduBN+%VVa)L++h|xqNvP7RY}|>!4*lcXZ?W{EUFJ7%&&nurwV6W zlfZX;))eqFJh`!T;}RlJxdgG)Fv|iLD3z__&6SBSA4lSglwXy1hn)pv=E~}Rt97p7J45Q zA^8Q?0`>i_SxqZ(P?XfBMTp$m%jr`BZR6w5Ocf-kJkyaefCR^XU)|8sn6&ien!AZd zzlFNNr%7ZH$|pz;zmyE((WWz-(oEq*oXFp?3-%9q)g4cMbqWw1{?)cUozwBIm==Zr z-H@^QN!!;2MnBciDNUC+@S%=zw`*-oQ<5^Adqw%^V$%VuZtxzP?jIvb%{TB8 zW1_qf_BqiSu-KdL5IyAe4e_j_8?Cq}lOt10ITxikyV_JPXd;o#jns5?qm)Q( zj*E%MoqTb;wBmp`6RPb@Kx6!_)tYhb&SQH&K@z#`#q72xQ{q3Ekdhxn_w89)QSWgS z(;cGge?SMZ0hU^*}8TU-nlq z>h1G)u&X5=WLtNZbgR6p5vzYwaH^2_R0IIXBRL0o+b_rq;pfQzUW7IM1Q5ZB*ptQ; zQ;0(r*=!4G;z|igIuD)ddMSnh6uNHf>)tU5VcyrfX$M+23JDD%OsV}qE#Xo*AF9np z_U#$w@H4D^DR$G4x@_k(Odi8xefTyVG{!p+J-He&5pw~$R!z{p(hhZ8HClF_$l|Jrf_D}8eSlrUP8Yms5_sne#(Lnlk-H>0 z4jg(jEx%h-I|}%cAx`zt^}<k+XC=c@54ggDVU3OQ|+4%=e2)As$+1uOY7DU6N%SN_4?a9NLpw1V6+l@t< z-unB8oNS3LLj*Ww(2mSgsh@Y`KghxfxeIm=eAu9Wf!(Jrco=EIa8{e3F@SOe$L>Sj zxwmfnO^0$8Uw2O2xiw%?n98f6zCsw0K2?nWV5%aBfgivh9X*K&mkk;Ds%3m1nLsa- z+id{W@_ohjv1b?qU~(f2YThwgjdrxDV}t=TYSg*;kf{$WctK4+4O@8o9ohVbSAE?= z$=Qi8u>KoU&HneDY$(1T@HMa+YSu{peO~onv8dR2o-vTWs*s1mqq?P=YK&p%^Owg` z8fn9!+ej;tb{591(%&-L%QGY z3n5GRCMNuFi@`>?-1hV2oo< z%n+JAocXaiKvoETlTs}@9MOiU-rgkJ#-IqliM`RM78B%1LHHQBn&ne67Q}N>z`&A)yp_;G$aKU3F7}yxXI_8)( z$+#3HOS|MV_+<-Y+%Z?PdsfV5i_Brm;cg_RLqt>eMT?o!SU<4`c{sdN4%`2UHW(*1(FIJ~P{o{gMdFL=1;o zBt`^xcJvG8Ntml876}Na35f>3+Ls}_Rz972)jph{E9^F$1#`S4aLDH+IpPaA=#&`Qd116D4zSTDr)gRD1 z+0WLfIM2z_+7?0`_??dm1b&@c{wibB2IG2;F~&PyPOO86#nUkH7;(Kr?B!U>^zlT= z;^AR+l}!BE>F+b;#Ur=L19RjaT`m`jJbu4yr$_YAaArctj*mAf0e9W?uYoyV=YQ-8 zC8xuBxBf0RRH5PT<+P!K{!5#Fgm9+G{jE3-T(86P$6%V|VH%_%7C|<#xcNWNWW<6n zQPjoJmwiw~a)V%+)D9Vg0|L5^>~R`enJ$AKl$@!4UFK|$9xCn7hBx0ZnL`_LJYY(+ zg+v&|%ubFXQ};IqJ^i*DcLeAlC_R_L=pT1}{gUH!*ot)8q!9D!scnd-(-&%*T_!sf zB|oR3Fp~++X!hkCqX!AH0_q1te~x5yHbT)l!+TTtyXs(`eScFK-_Pi5f*7bnjoeek zzgn%G0co)tQCZQ=JZ|IgNZL&?ApPMrfR_%OC1p+F8dfZ|tDmilsolxu5M~po@Z|V6 zbh}~rx+AlI!mvgYVxh=q z(`sa#MW5mLk>KRQLZdp^9&T2qSeG_SlV<3Hq`tk>!Mn{(wotH0^^Dbpp&{Q`J)lH} zP23udWygm*2T2E$>|U- z+WQ++^3VC(q((2uJ>Kp=!TI-d@8y-+8^SPW7BVH!}Rhvvc%z;{_#wS8N=T zhrLjz;7|`7(3mPjI(Xs)KSeedbP~I0*Vd*F@rW5tQ%#}hcKmPROh7Dsu}RJgNlJrZ zgv0isbJx5A;_%c3c1l_A_*yk#0VE^chv7Km>rqV3eaP8}i<9|EyNPXbjVTZ>^lAPe z7KlX>3SyvkY)5)sZoJza{;X)h81mhxi!3SLw6VU(^5b(V8NQe>BjXxQ+aZ!&vd+E@ z!gDM`6JF!r*^MO6e>5>Yg$+`VGKpfAcVCWQm3}Nx**`C$Ep*EdgP$()ELHpMHdQQcAQ;J^<-|xPl>H_2r`q=T zAUMJ-^Z@yn(nNEEh7cR^_ivg-zw~LrGlA+#7*8J)-JhvQ#KvG)BaaOJ!HuwCSUlF6 zjkMnrZP}pRUcQ4QKs$5uOdQiaKDcp3=h!MZhz#3$Uq8SG*y)Mn$FAZYhEY^dEOd^% z40LJxC1{(KUWZ=$&K%$j)$Ubc5e*NHXbpQA_2B}3WAif#OZh)>jydqAkqp7%vvELE zXS1HQ%L{h^6TN!*Z`D9*4Z@LSTNIH4>r7bXs5RpQ<$#vC9dJG=@c4lIX7%3}uy?G$ zo*3Bgo~Q~e3OKqXc-+k$Si~}SHdC}Z9lZ`e*vG*xG}QMya&$JOm8J8JtI;TC>G7nW za=G*TpJ#S5Mve6SA&kElr~P|ajpkntD8tzk=Uj}>aG8tTPWzr+Zg&!0(reYh6PFnF z81y1e49yJr7@s24ntvVu_pnAFUb)KJF0n|rn?OU&rx3F!qFY86_Q?ZqNJ0rKh^!~S z!i1qXy#XixSS2!}77U}NnL3=8dWa&CA-~YYc!0Ibl209J$g1F+Qf`jie6W62>Yn@v zc{nnBAbKi3>btqBl?YY9Z8_8{fk; zy#6YA=#9%SlfZ&qoQxs2Sarz-I=Qp0u)7nT{uhS|$V>j16zDy*UyLCS5dV?3wbb$c`Xl?1h%9P_yohJ`4o%li{mi(Yn<1FT9t8W-WgP%%o>#dcY@#uVe!+W zA6oAp`X$xxj#iQZKxpEYa&}Z>c)cZDE{!!(Idzl;gjBQa=0nd%Ns_rb2N9=9eR!h!tTyRcR+s6-%8E`Vj9ou?1i zlgYT2SiiIjJ(?Dpss+aL^C%NB1Kg9>+qf1W>lym!qBs1*-XGW3q1jL0H(YA4kUZ?R z^QpVr4Ox?Lt1+* z5FDwOVkT*FPC9NiQ>v>!MfEr2#eaJ%0vf)0jaCJ2TRBlUzK$)}5r6amYXgcc+-b3H zpe?m?s->l)8r3_OGPJ6F|Kj)N2}YfC{Z2=g{dOPzSZhPN@#ltq${SvhT)h?4k$ZY) z7B;SQ!UD$#_Z?2TMGdeG)#MNhy4@Qz>5J>%n)!NWL;oYE7&I>oM7gr*e{@(#KY%dM zSh$C)H8ca2081$vl~M;4lqFw^z~$9BtbH{GhxOw0;7BZ=Z3a+cjhlzUORxMO>C+*% zjX-gNH3x@>fnbaEZj>dM8BMxSr=}ljQEyXUL{;R+S7ve1a92o2*Cs9RFO-|o)xd}J z63ym4+~2yVy=Ncxh$aDR_Ve*39(6ox*9!tdEQ98PF=OE!(x1-Q9-ugTjmcilY&84v zpl+6%+L_S*prIcM&ttkAp+r71gGwDIQfGP7oCMgg!zJe#mK@T143E;9assPY$%)P)PiL%4tW;f3*MB$ixi7`_K$Pm-?Fr z$XrQ6ALBqpUqT8*HUFJj2^43G6%NU_H4G`JiVKp`Ia#G$OH_3}mq)ap$3B7E1kJ8G z-kMljQh)iofTX#NMWx{VN9A338UU-xZ>1E~>xF+ZNcIV$C9-k~&FpCs7G~vF%zjPo z>n}&pyp@_L4@`dyKjYG{&F3gdl<6%A6iM(S!lO@iAW$8#7?d4Ac1UxfCDshSxi`iY z=S3xmi^NI^c`EKi4eO>}p)1d1oD3LoH7Fb(v3C)!R<1Vp$!3jW1*fPqrIedb2Cl$? zBrcw8Je0YDnyVMB|CS~6#Fm-X%hcrVeSr+1>OCLg4<# z&np?P;i%{_=`boe7e-Gemuu*jTLg$bzELh!fH;|>G=UJeBFB2->TM(f=x}b^0EEB6 zw2AmVul%Z@aW^2x;hHAW!AKM6p#ou=q#&Px0@i;{nR4sV!b=>*2wJ}dPXuDJRFTAV zCqFoD8uEc;a+%L$?g>Yii{LqhHX-Wrx&EAsm$so;H`r;D_B{E7B{~FKvA{NO!8S)u z5HFxC&bUt8zr|`V1LBETB=8*d!e<@;jb=du)s-U$>Q$N*irVZHr_=1}Ndq9cBA{3W zd|s$uW7MFr^N-%$wxpv^>Ky!Rco0x?B)P4gRft^u|1~+f*+I1`ukB}S-M27ZAxxQA z(1GW&eTVXmp=T%ah`xc1*m9;ej66_ZF7h|Kyx~^1obdFyQnWAVaOTiEzZ*k?PtH*h zd~Q!-PKIRllbr!O3k&qR%$2`EmPsJR`=qDHVckFXXO7J{h08&>hUYSN%=kqEmE*B; z6`n9io&W?1Hdu{tF;0sKO6g{v4w;Tc=}H*1$DJIJ_&S0PM~d2FTDEqTNO}-Cc8cRJ z$P9FjzMP^l8w#yxN?Yq-SrmIhK^+A#2jEYjfwX9fQw#;Yt?Bml$SUNqp01Z%Bdd9d z+n+V<@17k8e+7m!{X5MD&=(W^x@G^JxL)?!c_ZUF99Fe6vf8*|KwZP@WJ6)4JAT5D zy7uX|j81pUZs9w0DOny@o7A0TC=OE?C{|*O|Mw(|p!NoIcDY%71<3@Jb}-GYu2!^K z5hY8Lgrc5aw=vFZlZG{L-A1B@5iT+!cLw)GL8aD$*|R(Q_}THm;&v(v_tYAw|1rV> z|A5%BN&0sezAM&U{D8wa&2JG(zq9~vzXL9&7H8kjXT_iC@wen^piph;_q~1grIH%= z(O9n3yEs36ZtGJY%@n}Ke?9PnYilHfkJ{H`% zot40WcZnlV|1znEiHh)QNdFZP3WIHfD@$opf6sJ}qs>$`h*2aHIEllCy#nw@An}Ok zMPJ>Xoqs_vME=nf4tohPj%{2DiET(gG~5^8ZED24YJ4|!YMG|H%47ax*lLf8-7c4K zV)S$MSEs<3o`J=iWo!3B{Uzp9dSc58_#T(NOyQ!E9G)&5G@KnZ*a1Xjh5X`AS02A@ z!NRLo1K08kIsKMJjg~Uji&8deVk})=!-07EgP2R&3wfVKdx2SxR#Z+ambu+D)4VGp zo8G_O`Gn`gE;x`9BHC`sK(yj9tt_Wu;}lHnO)DpCvQWZi)L*UlRX>#tDCx?v_TrA zb{b_zWJ=Ho*gXcoWz$tMBx(|)t0CsTXgomz`3)j=&L-9%2lV5Y`1sKQ=_0w*ck2yI zh!JdVloRpGFe~~61IMhTX3ut^FN?9gR%->P_?R5tNNv&d(oY;*y^*Y*4M+`*1-DB?E4I=L1beAvb}z#! zso5E`h|i|QN0s7J_c#hGTyzmMQ3s`*D)XdXidQM&8(2w{y#~*qG?clUa{9soaoSb{ z_}NTnnVxKHZGWVzFK~syt%J$YNIU2RyG%lhj^`8#UO=>IxdpnJyJHm6ZA@AGTw8bO z!<%%!e5|iHx2Yi6js5z$I<~U{1H-BIaoc6Nd5)sA#rKF@{k(9)#r+NI>js{(mQ7Dr z3-;N&zMdKfhY0rQnlrk!TZ+JR$l^5*Ga7SP#hqpcwpnB}UdQcUv z_M5$jK9Z44NP136&xkkcOUge#{6;tPzL07x{i%_$=zj4C4}c}r!)cyJcCMv)l;2J_ z%(2XoXkwCL$vLhNk`ri*H%*X_OV}j#-c{)LTMTFVlCDjp#}cS3PFzUxZ8 z#rZIUfTWcN5=~&wN$P&yE=W%lI1=BEFd+D;0wQ5|{q%7f?QU}J;h-nj>Rbm1ZsF#{i zh+8QsW5JAL$xei@53O;UB_dLz)v`;?a?pmUJeZcMf7Fvf%xfl7v5ua4!pcagWOxvF z4sq0%!0@Z?*XIDUhPj-UtWQBf_ocWA@Ccgye`&C~5^FR~EE&CFY}$RiCfMznprw_f zx==xrV`FzatPya%7Uuaq)bhKWnhI$xZ-V85Y@25*wI5EA&YePeRyQsqKiyqOfr07H zlxvoCvJsvE3R9-clEzqTV1=kMIEOKPgUq*Vxu@>;EDag(xumGVG{EW(ZGm>hM%dCk za%QN3)M-oSTX98KMAU*00##92v!d1UB1p$8QfU4+qOS;K%GSy>BVPkGwlLD!wM_fSnwUk?05g5u@GSr5OWKALlL_4(*<&guWY>KV~e z0!TVTc>3Y@atn2C3YP11VS4|*#fuT7`Rykf>f`-tJ_37v3?>7_@-~Tn7GYr%YM11=%RV4!Y4$ zLa3^F5;$Z-u@8O8M@IHybDNQ`4R=WtjS6L$pXalmLw)ZvtiJWoGs)+}9Ub-t1VP&< zK*;*-Te3GEcOsBLsg~jLit>y00xoR8-bMR0d+6ZO8CRPs<_1_xdIrm&TWk5E7<*weDMo$~*H zyE^((>S>C!QUytpXKuA^k`+g~NyOe4>!X#RSXzM}yP;=k!rPDsf{%VX)Fx%ashO2M z>fxzBb?Op0;VQvGY@ z2hvRqf}q=dV)fkGLI)zV&7O{>gyL~mQhLgxj6Zt5)!7a@oOoh8+N}P=vpxCC^sRm% z6s3_Rio$Ui@FV*9!A|Wq5L=5^Gr6{yO|LWBZHWanoRhg1pKNAL`YHv-jh({O&T2b4 zaF$4@@{`ktWByS!m=b@3w}t+_VplXL6`PRKhF1TxN}YF4-~oB!lHf~G*1-Pey_v*>S zJne@jdqiG};>^&nwYG*ahqT#$o_SRV(AP67@Y83|E*yj7hL%krX$+7v#^KOa$z`h& zg~O6OunD0y#({MCmGZ4>WMqx7+g4?D&JkQ!?0lg5{E0!-W;~I7h-tNB?OG843g$@e zrbrG1ou!OTw)aGk7D^9A#WUpOc>zXI%o0t9{I5gW#SDVMRR|u8T0%!qtwm-!k{81> z<5GjPol6pz#T>s;x>5EI^7L;4IG2k_M95blzW197qFY^oTmv{=@2ce=YL25X+8lc{ z6&i>n6`SCD)!05Tm|Nfvl({T&JGFTPbN2BgH<*&gCh!5FiPCf^r|P;YmSRV~x!k4j z-8Vd`s(qmZ(r9U_s?8oOt&D$xA^u-r@aOTj`w9%nHqN<` zV#a~1cmQERjK!$Wv%fpA!SH2B-*Iu(4Nd)8MOfg=mxw5qqMq{+CA#oPMP3`>1CdQD zowyae6@*k744t=LAG3r}MR1IIJ*fwE*9BMAr8){6DArJy~ z01MB`p`6C_zNaU?y8D^osDYP z6lb3XsgRGF(hmD2qjA*)cHclr>B9cw3SvN{_!9gX#CWyAcS$+Up zxpYS^GFJ4$tD0QpW3^nV+Js#HC>`UvY}?2owt>{{1xA_YSBW9*rp{qx^o)bBo9OiL zioT|m#YCQP+dml3T0j;D|skCdVb~?&7*M0l+M?!sTElzzlJS zs>t0-%8vHPgwV+SC?(1_v@n>%B~mSinzN(H$2(l00lzzt%ak?GrFJzL>=p*L;>uJB zTN~ntzRw=JxbN*JoPV5f`+QE$4D`ek_^c7|-;{0(vfB5*jLbsAY9VNOjIJ77eLy8H zd}MvnxPP+$MfV1~^ajI`lQj5qudeLkef-wl(Sdn>;c|SA0!SZbpvfrd`{A(M1V%Af zmS>!DWM`G^oT(3YJp$nLLXmkUGK$#Z96ZLcHmprB z61ETaVTquu6OeroJUqDh z9Qf>5Fs%AImQoE294ZkL&3{5b2(AA_4`(Z0o9A$x;L-?0hdjUMxtDfI$0>->Qv>(L zldS3T>CDgnh+-AM$@U;J5UP+odJgY3XNb?(?6Lg!9ojT$;%B z9EXo~y$(m<3VD_<{rImSqSw|^j8cDc?;puhqK!l~6umG+60Em*H4GO#H85OJP0L1( z#=^!nJnGPeDzD9Qs7;yr^-3Ux9LV936UwK_cmx$OBoKWQhk(1$XgNj!Qx_M+wVMNj zwv2p!voCA0J%ZF%G^*DxytMp*(b_%OWa_ z-Bi>V;=h*&CDf5jw#@ujq(FyqpQ*xGCE;Of;zP|NnO9@7*RRDU3H%OaAM3t1Y&@@N zHYQkS!=3RV=tc)O^#02%y|0IFT{;9n=6Z?O_<1r-x-XYzf2_8SfoX=UyU7|yFE3&y zrXY1C2$}q!D1*v&GVXHwJi97Nh?CCJe@MG2o9OGPu0|?(t%S<(PL^$JH#ETuH%i@G z#fNXKIpQq#S>k@GoyAgy#Q0%9>=n(6x}W|qdF<~044z>IG{eqI=DizZf!eU!cp&H! z<9&<~#C-)=0zXIp^}0AA(cw~k#wcp2FHqc0r<$=e(ulfJs!Qosk}2GFyt08m)XBZL7+@T!iwqA`h#kriM+3lk6!C z$`*ESganl2AQM~>5330al%(JPRov&{#o|WdTQmx*-VaO=$v7Qk%@azz0ABX>4XW35 zK9B;T|F_`D9}NsOd9nsUy%3>w1ZgY>w%rartw0$xMNYqv zGUA2BrN^{`;SDJ-#Sd)v>E13W~MO2J~nD_SMgi!?i zHtE|MU<}E?=qxG8xc&8C{iTif_uw_?oi6+EU&(!Q%MM)o=282Ne%28X$TaIla&KQ+ zTC@*fUsF?4b{Y2d@BjL`CF%8APp?AJWXGfwV-BYd3E%S{fr??Jw2^wF98qY=jz?=6KZ@QIbkc+f-_tL6M_&`uP)&n zn!t7E@8)YUG1a2h5Ni||Ei!-ex_$RQ->|Fm9|J&48^)69KvJne7#r!s%a=c-PIil? zV}uu^2vzHP@c3~{!mO&rjOB|t`|*`)fLz%U{R8&Q?>uLx9)Hqi50BaO#38bbC>hx= z2C!L#!IQOybN$|quwT7L;1@^0f$JB?#y{~0{J$e05Yv*Ep_+v^0i{kXopQNc!-H_E z4GH}%`^SI!2i)fugF5l*wd+=567ho%JyQ8FTlN)H zg9D6H@#PWNuMu$I+OJRE@B6Mspb1>flN9kD45qnA)1~q&;}+kJ(y#=ez4qE`cJaN7 z_THrr?6DIknUghbw-;CK=-iy8#tz!X+A5962|IT5h;?>!BB!UP>t`C6o9FT09)bN3 z0SB)A@Ra=?cO(K$@KP;oD_B6G!hnfsD5O$*@*`Yh%5qP4pLO>o5PGzS9xiQL#jH2Z zh!r&~OS^%XJ}@rT(L!zQe;aS?$o=_AJpwxw0SB&~ioBoqo{qqsp!I*f-eO{M3Hzov zQ;}=xwTej^4;lez5tx{qFl6VXef7Q?mido0NagiDAKugP^PBSs{IUo*aQ(9A_-7u0 zyBGn1l7t-kku!!bkAO$ulSROR>yyRFxAF*h1Uv#Bfn5>-&y??y2jQ2ozak*E)l4Do zuRHg<^$7gx5pZ9aUp<0^5_jJrEuNkAO$OBj6F(BN6xs XD$4jgm8idf00000NkvXXu0mjflRi;b literal 0 HcmV?d00001 diff --git a/img/event-journey-map.png b/img/event-journey-map.png new file mode 100644 index 0000000000000000000000000000000000000000..1a02abb2b2707b80d8b7048178722d4e74a40fc5 GIT binary patch literal 327157 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 z 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

6);fkCRL8JGNIw^70z`4BKg5_Z$5cVY49Kw)p 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 OZ)qX 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 Z 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

=aw=ltT7I|8yK)`56+O=#SZ(G4eVeh@FK* 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 literal 0 HcmV?d00001 diff --git a/img/journey-map.png b/img/journey-map.png new file mode 100644 index 0000000000000000000000000000000000000000..a71ccbed8ae4b8b21663f7cba50b2f26ab60f51f GIT binary patch literal 47811 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 V`tZEM;MahkC(??Kily{k{|_1=cq#w@ literal 0 HcmV?d00001 diff --git a/img/joystick-F710.webp b/img/joystick-F710.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3bce1863b9ffa8bf9a09b0d3deebaad3ca20bb1 GIT binary patch literal 43298 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index a5f5e997..12c69b08 100644 --- a/index.html +++ b/index.html @@ -1473,9 +1473,9 @@

Welcome to the AI Racing League

Promoting equity and innovation in AI education.

-

+

The AI Racing League is a fun way to learn the concepts behind artificial intelligence! We learn AI by teaching small remote-controlled (RC) cars to drive around a track autonomously. The cars use a low-cost Raspberry Pi computer (or NVIDIA Nano) with a camera. Students drive around the track and gather a set of images to "train" a neural network that can be used to automatically steer the car.

-

In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide-variety of lesson plans from 5th-grade up to college-level participants.

+

In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide variety of lesson plans from 5th-grade up to college-level participants.

Our secret sauce is to combine the right hardware, software, mentors and a flexible learning curriculum to create fun events that students love to participate in.

Current Status

We are in the process of restarting our events starting in the fall of 2023. Please contact Dan McCreary if you would like to participate.

diff --git a/journey-map.css b/journey-map.css new file mode 100644 index 00000000..6c83a47d --- /dev/null +++ b/journey-map.css @@ -0,0 +1,35 @@ +/* Add your desired styling here */ + +body { + font-family: Arial, Helvetica, sans-serif; +} + +.map-container { + position: relative; + width: 400px; /* Adjust as per your map image */ + } + + .regions { + position: absolute; + top: 0; + left: 0; + } + + .region { + position: absolute; + border: 1px solid black; + background-color: rgba(255, 255, 255, 0.3); + cursor: pointer; + } + + #tooltip { + position: absolute; + top: 0; + left: 0; + padding: 5px; + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3); + display: none; + } + \ No newline at end of file diff --git a/journey-map.html b/journey-map.html new file mode 100644 index 00000000..8dcbdea3 --- /dev/null +++ b/journey-map.html @@ -0,0 +1,28 @@ + + + + Map Hover Demo + + + +

Event Journey Map

+
+ Map with Regions +
+ +
+
+
+
+ +
+
+
+
+ +
+
+ + + + diff --git a/journey-map.js b/journey-map.js new file mode 100644 index 00000000..3788c0a7 --- /dev/null +++ b/journey-map.js @@ -0,0 +1,46 @@ +document.addEventListener("DOMContentLoaded", function () { + console.log("Document is loaded and parsed"); + + const map = document.getElementById("map"); + const tooltip = document.getElementById("tooltip"); + const regions = document.querySelectorAll(".regions .region"); + + console.log(`Found ${regions.length} region elements`); + + regions.forEach((region, index) => { + console.log(`Region ${index + 1}: `, region); + + region.addEventListener("mouseover", function (event) { + const { x, y, width, height, text, url } = region.dataset; + + console.log(`Mouseover event for Region ${index + 1} at coordinates (x: ${x}, y: ${y}). Width: ${width}, Height: ${height}. Text: ${text}, URL: ${url}`); + + tooltip.innerText = text; + tooltip.style.top = `${parseInt(y) + map.offsetTop}px`; + tooltip.style.left = `${parseInt(x) + map.offsetLeft + parseInt(width)}px`; + tooltip.style.display = "block"; + }); + + region.addEventListener("mouseout", function (event) { + console.log(`Mouseout event for Region ${index + 1}`); + tooltip.style.display = "none"; + }); + + region.addEventListener("click", function (event) { + const { url } = region.dataset; + console.log(`Click event for Region ${index + 1}, navigating to URL: ${url}`); + window.location.href = url; + }); + + region.addEventListener("mouseover", function (event) { + const { x, y, width, height, text, url } = region.dataset; + console.log(`x and y values before parsing: x=${x}, y=${y}`); + const parsedX = parseInt(x); + const parsedY = parseInt(y); + console.log(`x and y values after parsing: x=${parsedX}, y=${parsedY}`); + + // Rest of your code... + }); + + }); +}); diff --git a/search/search_index.json b/search/search_index.json index adb3ea59..0657fda4 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to the AI Racing League Promoting equity and innovation in AI education. The AI Racing League is a fun way to learn the concepts behind artificial intelligence! We learn AI by teaching small remote-controlled (RC) cars to drive around a track autonomously. The cars use a low-cost Raspberry Pi computer (or NVIDIA Nano) with a camera. Students drive around the track and gather a set of images to \"train\" a neural network that can be used to automatically steer the car. In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide-variety of lesson plans from 5th-grade up to college-level participants. Our secret sauce is to combine the right hardware, software, mentors and a flexible learning curriculum to create fun events that students love to participate in. Current Status We are in the process of restarting our events starting in the fall of 2023. Please contact Dan McCreary if you would like to participate. The following organizations have expressed an interest in helping out: Code Savvy - Contact: Valarie Lockhart - The AI Racing League runs as a project under Code Savvy. They are a 503C not-for-profit organization. Minneanalytics - Contact: Dan Atkins - contact Dan Atkins directly if you are looking for funding for your team. Washburn High School - Contact: Peter Grul Best Buy Education - Contact: Wes Strait - Wes and his team have run several events using the Amazon deep racer. Minnesota STEM Partnership - Contact: Michael Wulf - Michael created his first AI Racing League team in the summer of 2021. Create Minneapolis Contacts: Krista Stommes and Rob Mission The mission of the AI Racing League is to create and deliver educational materials that will make fun AI training accessible to everyone. We place a special focus on students from disadvantaged communities including women and minorities. We work as a sub-project of the CodeSavvy not-for-profit organization and we adhere to their guidelines for the quality and security of our students. This means that all our volunteers have background checks and we limit the student-to-mentor ratios to no more than three students per mentor. We are committed to equal-opportunity mentoring. We strive to recruit, train and retain the best mentors we can find. We are inspired by the values behind the CoderDojo mentoring system and their innovative use of flexible concept cards . We attempt to publish concept cards that provide a flexible and agile training environment for a wide variety of learners. We believe strongly in student-led initiatives and project-based learning. We feel students learn the most when they are building things together in teams. We believe our curriculum should be broad to support a wide variety of students from begging Python to advanced AI. Rather than force students down a single path of learning, we believe our instructors should be more like travel guides to help students explore their areas of interest. Our curriculum needs to adapt to single-hour events up to multi-year mentoring. See Rhizomatic Learning for what inspires us. Checkout Our Other Sites: AI Racing League Beginning Python [MBOT] MicroPython for Kids ChatGPT for Teachers AI for Kids MBOT IoT Hackday - costume contest Other Resources Education Material: If you would like to teach AI Racing in the classroom, at a meetup or even in a corporation check out our resources here Resources: Want to connect or contribute to the community check us out here About us: Want to know more about us? Check us out","title":"Home"},{"location":"#welcome-to-the-ai-racing-league","text":"Promoting equity and innovation in AI education. The AI Racing League is a fun way to learn the concepts behind artificial intelligence! We learn AI by teaching small remote-controlled (RC) cars to drive around a track autonomously. The cars use a low-cost Raspberry Pi computer (or NVIDIA Nano) with a camera. Students drive around the track and gather a set of images to \"train\" a neural network that can be used to automatically steer the car. In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide-variety of lesson plans from 5th-grade up to college-level participants. Our secret sauce is to combine the right hardware, software, mentors and a flexible learning curriculum to create fun events that students love to participate in.","title":"Welcome to the AI Racing League"},{"location":"#current-status","text":"We are in the process of restarting our events starting in the fall of 2023. Please contact Dan McCreary if you would like to participate. The following organizations have expressed an interest in helping out: Code Savvy - Contact: Valarie Lockhart - The AI Racing League runs as a project under Code Savvy. They are a 503C not-for-profit organization. Minneanalytics - Contact: Dan Atkins - contact Dan Atkins directly if you are looking for funding for your team. Washburn High School - Contact: Peter Grul Best Buy Education - Contact: Wes Strait - Wes and his team have run several events using the Amazon deep racer. Minnesota STEM Partnership - Contact: Michael Wulf - Michael created his first AI Racing League team in the summer of 2021. Create Minneapolis Contacts: Krista Stommes and Rob","title":"Current Status"},{"location":"#mission","text":"The mission of the AI Racing League is to create and deliver educational materials that will make fun AI training accessible to everyone. We place a special focus on students from disadvantaged communities including women and minorities. We work as a sub-project of the CodeSavvy not-for-profit organization and we adhere to their guidelines for the quality and security of our students. This means that all our volunteers have background checks and we limit the student-to-mentor ratios to no more than three students per mentor. We are committed to equal-opportunity mentoring. We strive to recruit, train and retain the best mentors we can find. We are inspired by the values behind the CoderDojo mentoring system and their innovative use of flexible concept cards . We attempt to publish concept cards that provide a flexible and agile training environment for a wide variety of learners. We believe strongly in student-led initiatives and project-based learning. We feel students learn the most when they are building things together in teams. We believe our curriculum should be broad to support a wide variety of students from begging Python to advanced AI. Rather than force students down a single path of learning, we believe our instructors should be more like travel guides to help students explore their areas of interest. Our curriculum needs to adapt to single-hour events up to multi-year mentoring. See Rhizomatic Learning for what inspires us.","title":"Mission"},{"location":"#checkout-our-other-sites","text":"AI Racing League Beginning Python [MBOT] MicroPython for Kids ChatGPT for Teachers AI for Kids MBOT IoT Hackday - costume contest","title":"Checkout Our Other Sites:"},{"location":"#other-resources","text":"Education Material: If you would like to teach AI Racing in the classroom, at a meetup or even in a corporation check out our resources here Resources: Want to connect or contribute to the community check us out here About us: Want to know more about us? Check us out","title":"Other Resources"},{"location":"about/","text":"About the AI Racing League DIY Robocars and the Donkey Cars are the community that kick-started the AI Racing League into existence by hosting self-driving races. There are now several meetups around the country. See DIY Robocars Website to learn about events, classes, tips, projects, and instructions to build other types of cars. Checkout the Official Donkey Car Site https://www.donkeycar.com/ Coder Dojo A community of over 2,300 free, open and local programming clubs for young people 58,000 young people are being creative with technology with the help of 12,000 volunteers in 94 countries Visit https://coderdojo.com Code Savvy Code Savvy strives to make kids and teens more code-savvy through creative educational programs and services. We incubate and support community-based programs that bring technology and know-how to local kids and educators, all the while championing gender and ethnic diversity. Code Savvy is dedicated to ensuring the next generation of computer science professionals represents the billions of users of tomorrow\u2019s innovative technologies. Visit https://codesavvy.org Licensing Like all CoderDojo-created content, you are free to use this content in K-12 noncommercial educational settings for teaching without paying license fees. We also encourage our community to create variations and help us enlarge the curriculum. We always appreciate attribution! Details of the license terms are here: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)","title":"About at ARL"},{"location":"about/#about-the-ai-racing-league","text":"DIY Robocars and the Donkey Cars are the community that kick-started the AI Racing League into existence by hosting self-driving races. There are now several meetups around the country. See DIY Robocars Website to learn about events, classes, tips, projects, and instructions to build other types of cars. Checkout the Official Donkey Car Site https://www.donkeycar.com/","title":"About the AI Racing League"},{"location":"about/#coder-dojo","text":"A community of over 2,300 free, open and local programming clubs for young people 58,000 young people are being creative with technology with the help of 12,000 volunteers in 94 countries Visit https://coderdojo.com","title":"Coder Dojo"},{"location":"about/#code-savvy","text":"Code Savvy strives to make kids and teens more code-savvy through creative educational programs and services. We incubate and support community-based programs that bring technology and know-how to local kids and educators, all the while championing gender and ethnic diversity. Code Savvy is dedicated to ensuring the next generation of computer science professionals represents the billions of users of tomorrow\u2019s innovative technologies. Visit https://codesavvy.org","title":"Code Savvy"},{"location":"about/#licensing","text":"Like all CoderDojo-created content, you are free to use this content in K-12 noncommercial educational settings for teaching without paying license fees. We also encourage our community to create variations and help us enlarge the curriculum. We always appreciate attribution! Details of the license terms are here: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)","title":"Licensing"},{"location":"business-plan-2020/","text":"AI Racing League Business Plan for 2020 Summary This business plan governs the AI Racing League for the calendar year 2020. We are operating as a project within CodeSavvy. CodeSavvy is a register 501C organization. CodeSavvy's mission is to promote coding skills in youth with a focus on promoting mentoring and training for girls and disavantaged youth. Brief History The AI Racing League was founded in the summary of 2019. We were inspired by the viral global DonkeyCar project. We wondered if the DonkeyCar racing events could be used to teach AI in the classroom. The goals of the founders were to promote fun events that taught AI to girls and disavantaged youth. We recieved an initial round of $9K in funding from the Optum Technology Social Responsibility and lauched our first event in August of 2019. This event was done at the International School of Minnesota and attracted members from the AI Research community, schools, educators and students. Since August we have participated in over a dozen events promoting AI instruction. We have trained and initial set of approximatly 50 mentors that are familair with the use of the DonkeyCar Status as of January 2020 Inventory of Assets 2 GPU Servers 10 DonkeyCars AI Racing League Web Site AI Racing League Concept Cards AI Racing League Concept Dependancy Graph Documented best practices (Lessons learned, SD image inventory etc.) Miscellenous training material Marketing materials including testimonials Post on social media Goals for 2020 Financial Goals","title":"Business Plan"},{"location":"business-plan-2020/#ai-racing-league-business-plan-for-2020","text":"","title":"AI Racing League Business Plan for 2020"},{"location":"business-plan-2020/#summary","text":"This business plan governs the AI Racing League for the calendar year 2020. We are operating as a project within CodeSavvy. CodeSavvy is a register 501C organization. CodeSavvy's mission is to promote coding skills in youth with a focus on promoting mentoring and training for girls and disavantaged youth.","title":"Summary"},{"location":"business-plan-2020/#brief-history","text":"The AI Racing League was founded in the summary of 2019. We were inspired by the viral global DonkeyCar project. We wondered if the DonkeyCar racing events could be used to teach AI in the classroom. The goals of the founders were to promote fun events that taught AI to girls and disavantaged youth. We recieved an initial round of $9K in funding from the Optum Technology Social Responsibility and lauched our first event in August of 2019. This event was done at the International School of Minnesota and attracted members from the AI Research community, schools, educators and students. Since August we have participated in over a dozen events promoting AI instruction. We have trained and initial set of approximatly 50 mentors that are familair with the use of the DonkeyCar","title":"Brief History"},{"location":"business-plan-2020/#status-as-of-january-2020","text":"","title":"Status as of January 2020"},{"location":"business-plan-2020/#inventory-of-assets","text":"2 GPU Servers 10 DonkeyCars AI Racing League Web Site AI Racing League Concept Cards AI Racing League Concept Dependancy Graph Documented best practices (Lessons learned, SD image inventory etc.) Miscellenous training material Marketing materials including testimonials Post on social media","title":"Inventory of Assets"},{"location":"business-plan-2020/#goals-for-2020","text":"","title":"Goals for 2020"},{"location":"business-plan-2020/#financial-goals","text":"","title":"Financial Goals"},{"location":"command-line-tips/","text":"Command Line Tips Get Setup 1 2 3 git config --global user.name \"Joe Smith\" git config --global user.email \"Joe.Smith123@gmail.com\" git config --global credential.helper store Raspberry Pi Command Line Tips From Terminal, you can open the current directory in the File Manager using the xdg-open command. This is similar to the Mac open command. 1 $ xdg-open . See If the PWM Board Is Working 1 i2cdetect -l This should return 1 i2c -1 i2c bcm2835 ( i2c @7e804000 ) I2C adapter 1 i2cdetect -y 1 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- Note that the line 40 and 70 has values under column 0 (I2C bus 1) If you unplug the data you should get: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- SD Card Speed Test Home -> Accessories -> Raspberry Pi Diagnostics 1 2 3 4 5 6 7 8 9 10 11 12 13 Raspberry Pi Diagnostics - version 0 . 9 Sat Jul 3 14 : 25 : 23 2021 Test : SD Card Speed Test Run 1 prepare-file ; 0 ; 0 ; 20628 ; 40 seq-write ; 0 ; 0 ; 21999 ; 42 rand-4k-write ; 0 ; 0 ; 4498 ; 1124 rand-4k-read ; 8695 ; 2173 ; 0 ; 0 Sequential write speed 21999 KB / sec ( target 10000 ) - PASS Random write speed 1124 IOPS ( target 500 ) - PASS Random read speed 2173 IOPS ( target 1500 ) - PASS Test PASS","title":"Command Line Tips"},{"location":"command-line-tips/#command-line-tips","text":"","title":"Command Line Tips"},{"location":"command-line-tips/#get-setup","text":"1 2 3 git config --global user.name \"Joe Smith\" git config --global user.email \"Joe.Smith123@gmail.com\" git config --global credential.helper store","title":"Get Setup"},{"location":"command-line-tips/#raspberry-pi-command-line-tips","text":"From Terminal, you can open the current directory in the File Manager using the xdg-open command. This is similar to the Mac open command. 1 $ xdg-open .","title":"Raspberry Pi Command Line Tips"},{"location":"command-line-tips/#see-if-the-pwm-board-is-working","text":"1 i2cdetect -l This should return 1 i2c -1 i2c bcm2835 ( i2c @7e804000 ) I2C adapter 1 i2cdetect -y 1 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- Note that the line 40 and 70 has values under column 0 (I2C bus 1) If you unplug the data you should get: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --","title":"See If the PWM Board Is Working"},{"location":"command-line-tips/#sd-card-speed-test","text":"Home -> Accessories -> Raspberry Pi Diagnostics 1 2 3 4 5 6 7 8 9 10 11 12 13 Raspberry Pi Diagnostics - version 0 . 9 Sat Jul 3 14 : 25 : 23 2021 Test : SD Card Speed Test Run 1 prepare-file ; 0 ; 0 ; 20628 ; 40 seq-write ; 0 ; 0 ; 21999 ; 42 rand-4k-write ; 0 ; 0 ; 4498 ; 1124 rand-4k-read ; 8695 ; 2173 ; 0 ; 0 Sequential write speed 21999 KB / sec ( target 10000 ) - PASS Random write speed 1124 IOPS ( target 500 ) - PASS Random read speed 2173 IOPS ( target 1500 ) - PASS Test PASS","title":"SD Card Speed Test"},{"location":"contacts/","text":"AI Racing League Contacts Dan McCreary - LinkedIn","title":"Contacts"},{"location":"contacts/#ai-racing-league-contacts","text":"Dan McCreary - LinkedIn","title":"AI Racing League Contacts"},{"location":"curriculum/","text":"Curriculum We have a long term vision of using an intelligent agent that will recommend the right content for each of our students based on their current knowledge and their learning goals. Beginning (Green) Concepts Batteries Motors Donkey Car Activity Go to the donkey car station and look at the sample Donkey Car. Ask a mentor to show you the parts. Questions 1) What are the key parts of the Donkey Car? The key parts are: * RC Car chassis * Nvidia Jetson Nano * Servo controller * Camera * Battery for the Nano 2) How do the front wheels turn? A 180 degree servo is used to steer the car 3) Can you find an electric motor? There is only a single motor in the RC chassis 4) Can you find a battery? Are their multiple batteries? There are two batteries - one for the motor and one for the Jetson Nano 5) Where is the Jetson Nano (computer)? It is right on top! 6) Where is the camera? Is it on the front or back of the car? The camera is on the top facing forward 7) What happens to the opposite wheel when you turn it? The transmission makes the wheels turn in opposite direction when one wheel is turned. - Is this correct? 8) How much does a Donkey Car cost? The car costs around $250 each. The RC chassis cost about $110. 9) Why do you think they call it a \u201cDonkey Car\u201d? They call it a \"Donkey Car\" because, like a Donkey, it is functional but not very sleek. Intermediate Concepts Machine Learning Activity Go to the machine learning station and watch the demos. Ask about the difference between if-else statements and machine learning. Questions 1) What is Machine Learning? How does it differ from traditional rule-based programming? Machine learning is a method of data analysis that automates analytical model building, based on the idea that systems can learn from data. Rule-based programming is built off of if-else statements in code, and therefore every possible situation has to be thought of in advance by the programmer. Therefore, machine learning is well suited for situations where all possible inputs may not be defined. 2) How does a computer learn? The computer learns through a process called training. Training is the process of adjusting a mathematical formula by feeding it data and adjusting the formula until it produces the desired output. 3) What are the major groups of machine learning? There are 5 major groups of algorithms within machine learning. They are: * The connectionists (Neural Networks) * The analogizers (Support Vector Machines) * The Bayesians (Bayes\u2019 Theorem) * The evolutionaries (Genetic Algorithms) * The symbolists (Inverse Deduction) 4) Applications of machine learning are everywhere, what are some examples? Some applications of machine learning are: * Voice Assistants (Siri, Alexa, etc.) * Translation * Self-Driving Cars Blue Concepts Black Concepts","title":"Curriculum Overview"},{"location":"curriculum/#curriculum","text":"We have a long term vision of using an intelligent agent that will recommend the right content for each of our students based on their current knowledge and their learning goals.","title":"Curriculum"},{"location":"curriculum/#beginning-green-concepts","text":"","title":"Beginning (Green) Concepts"},{"location":"curriculum/#batteries","text":"","title":"Batteries"},{"location":"curriculum/#motors","text":"","title":"Motors"},{"location":"curriculum/#donkey-car","text":"","title":"Donkey Car"},{"location":"curriculum/#activity","text":"Go to the donkey car station and look at the sample Donkey Car. Ask a mentor to show you the parts.","title":"Activity"},{"location":"curriculum/#questions","text":"1) What are the key parts of the Donkey Car? The key parts are: * RC Car chassis * Nvidia Jetson Nano * Servo controller * Camera * Battery for the Nano 2) How do the front wheels turn? A 180 degree servo is used to steer the car 3) Can you find an electric motor? There is only a single motor in the RC chassis 4) Can you find a battery? Are their multiple batteries? There are two batteries - one for the motor and one for the Jetson Nano 5) Where is the Jetson Nano (computer)? It is right on top! 6) Where is the camera? Is it on the front or back of the car? The camera is on the top facing forward 7) What happens to the opposite wheel when you turn it? The transmission makes the wheels turn in opposite direction when one wheel is turned. - Is this correct? 8) How much does a Donkey Car cost? The car costs around $250 each. The RC chassis cost about $110. 9) Why do you think they call it a \u201cDonkey Car\u201d? They call it a \"Donkey Car\" because, like a Donkey, it is functional but not very sleek.","title":"Questions"},{"location":"curriculum/#intermediate-concepts","text":"","title":"Intermediate Concepts"},{"location":"curriculum/#machine-learning","text":"","title":"Machine Learning"},{"location":"curriculum/#activity_1","text":"Go to the machine learning station and watch the demos. Ask about the difference between if-else statements and machine learning.","title":"Activity"},{"location":"curriculum/#questions_1","text":"1) What is Machine Learning? How does it differ from traditional rule-based programming? Machine learning is a method of data analysis that automates analytical model building, based on the idea that systems can learn from data. Rule-based programming is built off of if-else statements in code, and therefore every possible situation has to be thought of in advance by the programmer. Therefore, machine learning is well suited for situations where all possible inputs may not be defined. 2) How does a computer learn? The computer learns through a process called training. Training is the process of adjusting a mathematical formula by feeding it data and adjusting the formula until it produces the desired output. 3) What are the major groups of machine learning? There are 5 major groups of algorithms within machine learning. They are: * The connectionists (Neural Networks) * The analogizers (Support Vector Machines) * The Bayesians (Bayes\u2019 Theorem) * The evolutionaries (Genetic Algorithms) * The symbolists (Inverse Deduction) 4) Applications of machine learning are everywhere, what are some examples? Some applications of machine learning are: * Voice Assistants (Siri, Alexa, etc.) * Translation * Self-Driving Cars","title":"Questions"},{"location":"curriculum/#blue-concepts","text":"","title":"Blue Concepts"},{"location":"curriculum/#black-concepts","text":"","title":"Black Concepts"},{"location":"demo/","text":"Demos Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intellice we like discuss in our classes. Here some demos we use in our classrooms. The Teachable Machine by Google This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a \"classification\" model. Teachable Machine Much of our classroom work is centered around the hot topic of Deep Learning. But AI is much more than just Deep Learning. Here are a few other areas to consider. (Taken from the book The Master Algorithm) 5 Camps of Machine Learning Demos Connectionists (Neural Networks) Check Out TensorFlow Playground Analogizers (Support Vector Machines) TODO: FIND GOOD DEMO Bayesians (Bayes\u2019 Theorem) Check Out A Bayes' Theorem Example Evolutionaries (Genetic Algorithms) Watch This Animation Learn to Walk Symbolists (Inverse Deduction) Look at this Decision Tree Demo","title":"Demos"},{"location":"demo/#demos","text":"Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intellice we like discuss in our classes. Here some demos we use in our classrooms.","title":"Demos"},{"location":"demo/#the-teachable-machine-by-google","text":"This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a \"classification\" model. Teachable Machine Much of our classroom work is centered around the hot topic of Deep Learning. But AI is much more than just Deep Learning. Here are a few other areas to consider. (Taken from the book The Master Algorithm)","title":"The Teachable Machine by Google"},{"location":"demo/#5-camps-of-machine-learning-demos","text":"","title":"5 Camps of Machine Learning Demos"},{"location":"demo/#connectionists-neural-networks","text":"Check Out TensorFlow Playground","title":"Connectionists (Neural Networks)"},{"location":"demo/#analogizers-support-vector-machines","text":"TODO: FIND GOOD DEMO","title":"Analogizers (Support Vector Machines)"},{"location":"demo/#bayesians-bayes-theorem","text":"Check Out A Bayes' Theorem Example","title":"Bayesians (Bayes\u2019 Theorem)"},{"location":"demo/#evolutionaries-genetic-algorithms","text":"Watch This Animation Learn to Walk","title":"Evolutionaries (Genetic Algorithms)"},{"location":"demo/#symbolists-inverse-deduction","text":"Look at this Decision Tree Demo","title":"Symbolists (Inverse Deduction)"},{"location":"faqs/","text":"AI Racing League Frequently Asked Questions How much does it cost? All our events are free. However, ff you want to build your own car you are welcome to bring these to the events. Parts for a DonkeyCar typically run about $250 US. See our Car Parts Lists for details. What do I have to know before I come? Nothing! We have material for beginners without any prior knowledge of AI. What car part hardware do you use? We use mostly NVIDIA Nano and Raspberry Pi 4 for our single board computers. We use a wide variety of RC-car engines but the [Exceed Magnet] 1/16 scale RC car is a low-cost standard. See our Car Parts Lists for details. Typical car parts cost around $250 US. What GPUs do you use and how much do they cost? We use a standard PC chassis running Lunix with a NVIDIA GPU such as a GTX 2080. These PCs can be purchased for around $1,500. Se our GPU Parts List for details. How do I sign up as a student? The best way to get involved is by signing up as a student at the CoderDojo Twin Cities web site: Coderdojotc.org How do I become a mentor? The best way to get involved is by signing up as a mentor at the CoderDojo Twin Cities web site: https://www.coderdojotc.org/mentor_signup/ How do I start my own chapter of the AI Racing League Please connect with Dan McCreary on LinkedIn and indicate in the note you would like to start your own chapter. Be sure to include information about your leadership and technical background and any related experience working with STEM programs. Can I get a grant to purchase hardware for our school or club? We are working on arranging a grant application process. The best way to start this process is to gather a small group of volunteers that can create a sustainable club. Include people that have a combination of fundraising, technology, education and marketing skills. Reach out to local school administration officials to build a community of science/math and STEM educators. Network with local companies that are trying to build local talent in AI and machine learning. Please contact Dan McCreary on LinkedIn for details.","title":"FAQs"},{"location":"faqs/#ai-racing-league-frequently-asked-questions","text":"","title":"AI Racing League Frequently Asked Questions"},{"location":"faqs/#how-much-does-it-cost","text":"All our events are free. However, ff you want to build your own car you are welcome to bring these to the events. Parts for a DonkeyCar typically run about $250 US. See our Car Parts Lists for details.","title":"How much does it cost?"},{"location":"faqs/#what-do-i-have-to-know-before-i-come","text":"Nothing! We have material for beginners without any prior knowledge of AI.","title":"What do I have to know before I come?"},{"location":"faqs/#what-car-part-hardware-do-you-use","text":"We use mostly NVIDIA Nano and Raspberry Pi 4 for our single board computers. We use a wide variety of RC-car engines but the [Exceed Magnet] 1/16 scale RC car is a low-cost standard. See our Car Parts Lists for details. Typical car parts cost around $250 US.","title":"What car part hardware do you use?"},{"location":"faqs/#what-gpus-do-you-use-and-how-much-do-they-cost","text":"We use a standard PC chassis running Lunix with a NVIDIA GPU such as a GTX 2080. These PCs can be purchased for around $1,500. Se our GPU Parts List for details.","title":"What GPUs do you use and how much do they cost?"},{"location":"faqs/#how-do-i-sign-up-as-a-student","text":"The best way to get involved is by signing up as a student at the CoderDojo Twin Cities web site: Coderdojotc.org","title":"How do I sign up as a student?"},{"location":"faqs/#how-do-i-become-a-mentor","text":"The best way to get involved is by signing up as a mentor at the CoderDojo Twin Cities web site: https://www.coderdojotc.org/mentor_signup/","title":"How do I become a mentor?"},{"location":"faqs/#how-do-i-start-my-own-chapter-of-the-ai-racing-league","text":"Please connect with Dan McCreary on LinkedIn and indicate in the note you would like to start your own chapter. Be sure to include information about your leadership and technical background and any related experience working with STEM programs.","title":"How do I start my own chapter of the AI Racing League"},{"location":"faqs/#can-i-get-a-grant-to-purchase-hardware-for-our-school-or-club","text":"We are working on arranging a grant application process. The best way to start this process is to gather a small group of volunteers that can create a sustainable club. Include people that have a combination of fundraising, technology, education and marketing skills. Reach out to local school administration officials to build a community of science/math and STEM educators. Network with local companies that are trying to build local talent in AI and machine learning. Please contact Dan McCreary on LinkedIn for details.","title":"Can I get a grant to purchase hardware for our school or club?"},{"location":"glossary/","text":"AI Racing League Glossary of Term Calibration A step in setting up a DonkeyCar where around five values configuration file is created that reflect the physical aspects of the RC car. There are three parameters for the throttle and two parameters for the steering. It is important to get these five parameters correct so you can precisely drive your DonkeyCar. Catalog File A format of storing our image-related throttle and steering data in line-oriented file where each line contains the serialized JSON information when the image was captured. Note that the catalog files are not pure JSON files. Only the data within each line is a valid data JSON object. The catalog file formats have changed between DonkeyCar releases. The current version is called V2 format. CoderDojo An international program of over 2,300 coding clubs that uses data-driven practices to get students interested in coding. Many of the aspects of the AI Racing League uses these same principals. Key aspects of CoderDojo are: No fees for events - accessible to all Mentor ratios of no more than three students per mentor Project-based learning Focus on getting students to work in teams (social learning) Student-directed projects Focus on programs for girls in coding and underprivileged youth Their main web site is: http://coderdojo.com/ CoderDojo Twin Cities Python Labs These labs are a set of free-courses to learn Python using fun turtle graphics. There is no experience needed. Link to CoderDojo Twin Cities Python Labs CoderDojo Twin Cities MicroPython Labs These labs are a set of free-courses to learn MicroPython. You should have a background in Python to use these labs. There are lessons in sensors, motors and robots. Link to CoderDojo Twin Cities MicroPython Labs CoderDojo Base MicroPython Robot This is a $25 robot that you build and program with MicroPython. If you are working on a project that will lead up to a full DonkeyCar, this is an ideal project to get you started. The robot will get you familiar with concepts like PWM, motor controllers and sensors. Blog article Microsite Raspberry Pi Pico MicroPython Base Robot Code Savvy Code Savvy is a not-for-profit organization with 501(c)3 status from the IRS that the AI Racing League works as a sub-project. All the AI Racing League financials are organized under a Code Savvy program. Donations to the AI Racing League should be done though Code Savvy donations. Questions about Code Savvy can be sent to kidscode@codesavvy.org Code Savvy Web Site Concept Cards These are small laminated cards that have concepts information on them that students can learn. The idea is one-concept per card. See the CoderDojo TC Guide for Authoring Concept Cards Donkey Car This is a trademarked name of a car that is used at our events. The name implies \"ugly\" so you know that they are not designed to look pretty, just functional cars with a camera on the front. DonkeyCar web site GPU Server Each of the AI Racing League events usually has at least one GPU server for training our models. These are typically small portable PCs with a GPU card in them. The entire GPU server cost around $1,200 each and can train a 20,000 image data set in under five minutes. We typically suggest that clubs writing grants use a NVIDIA GEFORCE RTX 2070 8GB or similar card since it is both fast enough for 10-team events but cost effective that schools can afford them. These card are often available used on e-Bay for a few hundred dollars. Note that we have tried to use cloud-based services at some of our events but we can't be guaranteed that there is enough WiFi bandwidth to move large datasets and models to and from the cloud. We feel that the tasks involved in setting up the GPU server is also a valuable skill for our students. See the GPU Parts List for a list of components. Electronic Speed Control An electronic circuit that controls and regulates the speed of an electric motor. It also can reverse the direction of the motor. Our ESC Wikipedia Page on Electronic Speed Control Fifteen Degree Camera Angle The angle our cameras need to point down to have a good view of the road ahead. Normalized Values that have been converted into a standard that can be used across many situations. For example, we don't store the exact PWM ratios of the throttle and steering values in our catalog files. We convert these values into ranges from 0.0 to 1.0 so that all our machine learning models can share them. This is why we also need the configuration values when the drive commands are used to convert the normalized values back to the appropriate PWM ranges unique to each car. Pulse Width Modulation The way that we control the [Electronic Speed Controller] (ESC) and the servo by sending digital square waves with a variable ratio of the width of the positive part of the square wave. Wikipeda Page on Pulse-width modulation Tracks We want our clubs to all have affordable but high-quality tracks that are easy to roll up and store. Our suggestion is to find used billboard vinyl in a dark color (black or dark blue) and then use white and yellow tape to place down the lines. https://billboardtarps.com/product-category/billboard-vinyl/ YouTube Video Training Step The step in DonkeyCar setup where we take approximately 20,000 small image files and the throttle and steering information with each image to build a deep neural network. The training step requires us to move the data off the DonkeyCar's SD card and transfer the data to a more powerful GPU server. Using a typical $1,200 GPU server we can build a model file in around five minutes. This file is then transferred back to the DonkeyCar for autonomous driving. Tubs This is the term that the DonkeyCar software uses to store training data. Each tub consists of a catalog of information about the drive and the images associated with that drive. Note that the format of the tubs changes over time so old tubs formats may need to be converted to newer formats. Script to Convert Tugs from V1 format to V2 Format DonkeyCar Catalog Format Tub Catalog Format Each Tub is a directory (folder) has two components: A sub folder called \"images\" that contains the jpeg images gathered during a training run. There are typically 10,000 to 20,000 small images in a tub image folder. A file that describes the data about all the images called a Catalog file. The Catalog file is similar to a JSON file but it has no root data elements. NVIDIA Nano One of the two single board computers we use in our DonkeyCars. The current Nanos have 4GB RAM and a GPU for accelerating real-time inference. The full product name is the NVIDIA Jetson Nano. The price for a 4GB Nano is around $99 but they occasionally go on sale for $79. The Nano became available for sale in the US in April of 2019. A 2GB version has also been sold for $59 but the lack of RAM memory makes it difficult to use for many of our AI Racing League events and we don't recommend it. Note that we do not use the Nano for training. We transfer the data to a GPU server that has more parallel cores for training.","title":"Glossary"},{"location":"glossary/#ai-racing-league-glossary-of-term","text":"","title":"AI Racing League Glossary of Term"},{"location":"glossary/#calibration","text":"A step in setting up a DonkeyCar where around five values configuration file is created that reflect the physical aspects of the RC car. There are three parameters for the throttle and two parameters for the steering. It is important to get these five parameters correct so you can precisely drive your DonkeyCar.","title":"Calibration"},{"location":"glossary/#catalog-file","text":"A format of storing our image-related throttle and steering data in line-oriented file where each line contains the serialized JSON information when the image was captured. Note that the catalog files are not pure JSON files. Only the data within each line is a valid data JSON object. The catalog file formats have changed between DonkeyCar releases. The current version is called V2 format.","title":"Catalog File"},{"location":"glossary/#coderdojo","text":"An international program of over 2,300 coding clubs that uses data-driven practices to get students interested in coding. Many of the aspects of the AI Racing League uses these same principals. Key aspects of CoderDojo are: No fees for events - accessible to all Mentor ratios of no more than three students per mentor Project-based learning Focus on getting students to work in teams (social learning) Student-directed projects Focus on programs for girls in coding and underprivileged youth Their main web site is: http://coderdojo.com/","title":"CoderDojo"},{"location":"glossary/#coderdojo-twin-cities-python-labs","text":"These labs are a set of free-courses to learn Python using fun turtle graphics. There is no experience needed. Link to CoderDojo Twin Cities Python Labs","title":"CoderDojo Twin Cities Python Labs"},{"location":"glossary/#coderdojo-twin-cities-micropython-labs","text":"These labs are a set of free-courses to learn MicroPython. You should have a background in Python to use these labs. There are lessons in sensors, motors and robots. Link to CoderDojo Twin Cities MicroPython Labs","title":"CoderDojo Twin Cities MicroPython Labs"},{"location":"glossary/#coderdojo-base-micropython-robot","text":"This is a $25 robot that you build and program with MicroPython. If you are working on a project that will lead up to a full DonkeyCar, this is an ideal project to get you started. The robot will get you familiar with concepts like PWM, motor controllers and sensors. Blog article Microsite Raspberry Pi Pico MicroPython Base Robot","title":"CoderDojo Base MicroPython Robot"},{"location":"glossary/#code-savvy","text":"Code Savvy is a not-for-profit organization with 501(c)3 status from the IRS that the AI Racing League works as a sub-project. All the AI Racing League financials are organized under a Code Savvy program. Donations to the AI Racing League should be done though Code Savvy donations. Questions about Code Savvy can be sent to kidscode@codesavvy.org Code Savvy Web Site","title":"Code Savvy"},{"location":"glossary/#concept-cards","text":"These are small laminated cards that have concepts information on them that students can learn. The idea is one-concept per card. See the CoderDojo TC Guide for Authoring Concept Cards","title":"Concept Cards"},{"location":"glossary/#donkey-car","text":"This is a trademarked name of a car that is used at our events. The name implies \"ugly\" so you know that they are not designed to look pretty, just functional cars with a camera on the front. DonkeyCar web site","title":"Donkey Car"},{"location":"glossary/#gpu-server","text":"Each of the AI Racing League events usually has at least one GPU server for training our models. These are typically small portable PCs with a GPU card in them. The entire GPU server cost around $1,200 each and can train a 20,000 image data set in under five minutes. We typically suggest that clubs writing grants use a NVIDIA GEFORCE RTX 2070 8GB or similar card since it is both fast enough for 10-team events but cost effective that schools can afford them. These card are often available used on e-Bay for a few hundred dollars. Note that we have tried to use cloud-based services at some of our events but we can't be guaranteed that there is enough WiFi bandwidth to move large datasets and models to and from the cloud. We feel that the tasks involved in setting up the GPU server is also a valuable skill for our students. See the GPU Parts List for a list of components.","title":"GPU Server"},{"location":"glossary/#electronic-speed-control","text":"An electronic circuit that controls and regulates the speed of an electric motor. It also can reverse the direction of the motor. Our ESC Wikipedia Page on Electronic Speed Control","title":"Electronic Speed Control"},{"location":"glossary/#fifteen-degree-camera-angle","text":"The angle our cameras need to point down to have a good view of the road ahead.","title":"Fifteen Degree Camera Angle"},{"location":"glossary/#normalized","text":"Values that have been converted into a standard that can be used across many situations. For example, we don't store the exact PWM ratios of the throttle and steering values in our catalog files. We convert these values into ranges from 0.0 to 1.0 so that all our machine learning models can share them. This is why we also need the configuration values when the drive commands are used to convert the normalized values back to the appropriate PWM ranges unique to each car.","title":"Normalized"},{"location":"glossary/#pulse-width-modulation","text":"The way that we control the [Electronic Speed Controller] (ESC) and the servo by sending digital square waves with a variable ratio of the width of the positive part of the square wave. Wikipeda Page on Pulse-width modulation","title":"Pulse Width Modulation"},{"location":"glossary/#tracks","text":"We want our clubs to all have affordable but high-quality tracks that are easy to roll up and store. Our suggestion is to find used billboard vinyl in a dark color (black or dark blue) and then use white and yellow tape to place down the lines. https://billboardtarps.com/product-category/billboard-vinyl/ YouTube Video","title":"Tracks"},{"location":"glossary/#training-step","text":"The step in DonkeyCar setup where we take approximately 20,000 small image files and the throttle and steering information with each image to build a deep neural network. The training step requires us to move the data off the DonkeyCar's SD card and transfer the data to a more powerful GPU server. Using a typical $1,200 GPU server we can build a model file in around five minutes. This file is then transferred back to the DonkeyCar for autonomous driving.","title":"Training Step"},{"location":"glossary/#tubs","text":"This is the term that the DonkeyCar software uses to store training data. Each tub consists of a catalog of information about the drive and the images associated with that drive. Note that the format of the tubs changes over time so old tubs formats may need to be converted to newer formats. Script to Convert Tugs from V1 format to V2 Format DonkeyCar Catalog Format","title":"Tubs"},{"location":"glossary/#tub-catalog-format","text":"Each Tub is a directory (folder) has two components: A sub folder called \"images\" that contains the jpeg images gathered during a training run. There are typically 10,000 to 20,000 small images in a tub image folder. A file that describes the data about all the images called a Catalog file. The Catalog file is similar to a JSON file but it has no root data elements.","title":"Tub Catalog Format"},{"location":"glossary/#nvidia-nano","text":"One of the two single board computers we use in our DonkeyCars. The current Nanos have 4GB RAM and a GPU for accelerating real-time inference. The full product name is the NVIDIA Jetson Nano. The price for a 4GB Nano is around $99 but they occasionally go on sale for $79. The Nano became available for sale in the US in April of 2019. A 2GB version has also been sold for $59 but the lack of RAM memory makes it difficult to use for many of our AI Racing League events and we don't recommend it. Note that we do not use the Nano for training. We transfer the data to a GPU server that has more parallel cores for training.","title":"NVIDIA Nano"},{"location":"google-analytics/","text":"Google Analytics Our Google Tracking ID is: G-RL4MZ0MHZ4 You can see the activity here: Google Dashboard How We Enabled Google Analytics mkdocs material supports Google Analysis. We only need to add four lines to our mkdocs.yml configuration file. 1 2 3 4 extra : analytics : provider : google property : G - RL4MZ0MHZ4 See our mkdocs.yml on GitHub here: mkdocs.yml file in GitHub The following line is placed into each HTML web page in the site branch: 1 < script async = \"\" src = \"https://www.googletagmanager.com/gtag/js?id=G-RL4MZ0MHZ4\" >","title":"Google Analytics"},{"location":"google-analytics/#google-analytics","text":"Our Google Tracking ID is: G-RL4MZ0MHZ4 You can see the activity here: Google Dashboard","title":"Google Analytics"},{"location":"google-analytics/#how-we-enabled-google-analytics","text":"mkdocs material supports Google Analysis. We only need to add four lines to our mkdocs.yml configuration file. 1 2 3 4 extra : analytics : provider : google property : G - RL4MZ0MHZ4 See our mkdocs.yml on GitHub here: mkdocs.yml file in GitHub The following line is placed into each HTML web page in the site branch: 1 < script async = \"\" src = \"https://www.googletagmanager.com/gtag/js?id=G-RL4MZ0MHZ4\" >","title":"How We Enabled Google Analytics"},{"location":"hackathon/","text":"Hackathon Ideas Here are a set of ideas that can be used to plan a Hackathon around the DonkeyCar. Of course, if people are not familiar with the DonkeyCar, just getting it to work is a good project! These are more for teams that are extending the DonkeyCar software. Beginner Projects - done in under one day Ceate a UNIX shell script for managing the tub and model files. The script should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Build an RGB strip interface to display car and GPU status. The car status can move from red to green as the number of images gathered reaches a 10K image target. Use the Arduino Moving Rainbow site as your guide. Background with Arduino is helpful. Build an RGB strip interface to display the GPU training status. The RGB strip should change from red to green as the model error approaches a reasonable value like 0.01. Background with Arduino is helpful. You will also need to modify the TensorFlow interface to write error values to a serial port using python. Medium Projects - could be done with prep over a weekend Ceate a web interface for managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Create a Jypyter notebook for analysing data and managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Advanced Projects Create a mobile application to drive the car during training. This is the best practice for many low-cost robots like the MiP. Use the tilt APIs to make the car easy to steer. Create small and large versions of the DonkeyCar. The small version should work on a 12x16 track and the large version should work outdoors on grass. Use a Raspberry Pi or Nvidia Nano. Create a learning management system for running AI Racing League events. Create a list of concepts and load a dependancy list of concepts into a graph database like TigerGraph. Create a quiz that attendees use to enter their learning objectives and background. The app should then recomend what content they should use, what tables they should visit, and what mentors they should connect with in the right order. Bonus points of you build a cell phone front end. Car to GPU File Transfer Scripts Make it easy to transfer DonkeyCar test data to our GPU server. Start with a UNIX shell script that compresses the tub file and puts the data on a jump drive. Then work on using SSH to copy the files to the GPU server. Then add configuration of the Avahi application and the mDNS protocols to autodiscover the ARL GPU servers and prompte the user. Mobile App to Drive The Car Most robot systems like the MIP have a simple mobile application for driving your robot around. There are two modes: A tilt mode (where you steer by tilting the phone) and a pressure mode where you can control the speed and direction by pressing on a virtual joystick. The problem we have with the current DonkeyCar 3.X system is that the web-based application is difficult to use. The tilt mode does not work on web browsers. We suggest you use a program like AppInventor for Android or Google Flutter and Dash building mobile apps. Leaderboard Web Page Create a web application that tracks what teams are in the lead. The app should be a single-page application that allows team scores to be updated on a web form. The leaderboard can also be \"smart\" a look for the team config files on each DonkeyCar on the local-area network. OLED Extension Add a low-cost OLED screen to each car using the SPI bus. Have the OLED screen show key parameters such as hostname, static IP address, disk space free, training data size etc. Bonus points for a mode button to cycle through screens. See Dan McCreary for the hardware. LED Strips for Training Server Status Add an low-cost WS-2811-B LED strip to the GPU server. Make the strip blue when idle, red when you start training an new model, and have it fade to green as the model converges. See Dan McCreary for the hardware. Training Graph As students walk in, give them a tablet to register. It will also ask them basic questions. It will then ask them how long they will be there. It will then suggest a set of activities and some concepts to master. The graph is a dependacy graph of all the concepts we teach at the event. Also suggest a probability they will have fun at the event. Single Source Publishing for Concept Cards Our cards need to be authored in MarkDown but we want to disply on the web, in PPT and with PDF. To do this we want to adopt a single-source publishing pipeline.","title":"Hackathon"},{"location":"hackathon/#hackathon-ideas","text":"Here are a set of ideas that can be used to plan a Hackathon around the DonkeyCar. Of course, if people are not familiar with the DonkeyCar, just getting it to work is a good project! These are more for teams that are extending the DonkeyCar software.","title":"Hackathon Ideas"},{"location":"hackathon/#beginner-projects-done-in-under-one-day","text":"Ceate a UNIX shell script for managing the tub and model files. The script should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Build an RGB strip interface to display car and GPU status. The car status can move from red to green as the number of images gathered reaches a 10K image target. Use the Arduino Moving Rainbow site as your guide. Background with Arduino is helpful. Build an RGB strip interface to display the GPU training status. The RGB strip should change from red to green as the model error approaches a reasonable value like 0.01. Background with Arduino is helpful. You will also need to modify the TensorFlow interface to write error values to a serial port using python.","title":"Beginner Projects - done in under one day"},{"location":"hackathon/#medium-projects-could-be-done-with-prep-over-a-weekend","text":"Ceate a web interface for managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Create a Jypyter notebook for analysing data and managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes.","title":"Medium Projects - could be done with prep over a weekend"},{"location":"hackathon/#advanced-projects","text":"Create a mobile application to drive the car during training. This is the best practice for many low-cost robots like the MiP. Use the tilt APIs to make the car easy to steer. Create small and large versions of the DonkeyCar. The small version should work on a 12x16 track and the large version should work outdoors on grass. Use a Raspberry Pi or Nvidia Nano. Create a learning management system for running AI Racing League events. Create a list of concepts and load a dependancy list of concepts into a graph database like TigerGraph. Create a quiz that attendees use to enter their learning objectives and background. The app should then recomend what content they should use, what tables they should visit, and what mentors they should connect with in the right order. Bonus points of you build a cell phone front end.","title":"Advanced Projects"},{"location":"hackathon/#car-to-gpu-file-transfer-scripts","text":"Make it easy to transfer DonkeyCar test data to our GPU server. Start with a UNIX shell script that compresses the tub file and puts the data on a jump drive. Then work on using SSH to copy the files to the GPU server. Then add configuration of the Avahi application and the mDNS protocols to autodiscover the ARL GPU servers and prompte the user.","title":"Car to GPU File Transfer Scripts"},{"location":"hackathon/#mobile-app-to-drive-the-car","text":"Most robot systems like the MIP have a simple mobile application for driving your robot around. There are two modes: A tilt mode (where you steer by tilting the phone) and a pressure mode where you can control the speed and direction by pressing on a virtual joystick. The problem we have with the current DonkeyCar 3.X system is that the web-based application is difficult to use. The tilt mode does not work on web browsers. We suggest you use a program like AppInventor for Android or Google Flutter and Dash building mobile apps.","title":"Mobile App to Drive The Car"},{"location":"hackathon/#leaderboard-web-page","text":"Create a web application that tracks what teams are in the lead. The app should be a single-page application that allows team scores to be updated on a web form. The leaderboard can also be \"smart\" a look for the team config files on each DonkeyCar on the local-area network.","title":"Leaderboard Web Page"},{"location":"hackathon/#oled-extension","text":"Add a low-cost OLED screen to each car using the SPI bus. Have the OLED screen show key parameters such as hostname, static IP address, disk space free, training data size etc. Bonus points for a mode button to cycle through screens. See Dan McCreary for the hardware.","title":"OLED Extension"},{"location":"hackathon/#led-strips-for-training-server-status","text":"Add an low-cost WS-2811-B LED strip to the GPU server. Make the strip blue when idle, red when you start training an new model, and have it fade to green as the model converges. See Dan McCreary for the hardware.","title":"LED Strips for Training Server Status"},{"location":"hackathon/#training-graph","text":"As students walk in, give them a tablet to register. It will also ask them basic questions. It will then ask them how long they will be there. It will then suggest a set of activities and some concepts to master. The graph is a dependacy graph of all the concepts we teach at the event. Also suggest a probability they will have fun at the event.","title":"Training Graph"},{"location":"hackathon/#single-source-publishing-for-concept-cards","text":"Our cards need to be authored in MarkDown but we want to disply on the web, in PPT and with PDF. To do this we want to adopt a single-source publishing pipeline.","title":"Single Source Publishing for Concept Cards"},{"location":"learning-strategy/","text":"AI Racing League Educational Philosophy The AI Racing League educational philosophy is founded on the following values: Equal Opportunity - we work hard to keep all AI Racing League activities free and we work hard to encourage girls to be part of our programs. Student driven - we ask each student what their learning goals are and adapt to their needs Project based - we prefer to let students define their own projects and we find resources to support them. If learning about how to get a car to drive by itself that is great, but if they have other objectives we work hard to connect them with the mentor that will help them build whatever they are interested in building. Teamwork - we want students to work in teams so they learn not just about AI, but how to work with others. Flexibility - we want to be known as one of the most flexible learning organizations around. We don't force everyone to learn the same things. We take students in for 20 minutes or two years. We adapt to the needs of our students and we design our curriculum around their needs. Agility - in software there is a strong concept of \"Agile Development\" where team constantly get feedback on what works and adapt their goals every two weeks to meet the needs of their users. We use these same strategies to develop flexible content to meet the ever-changing interests of our students. Our Curriculum is based around building a series of concept cards that adhere to the \"one concept per card\" rule. Each card is a 5.5in X 8in laminated card with questions or challenges on the front and answers on the back. Concept cards have three difficulty levels with different colored borders. Green Borders - Beginner cards that anyone can start with at any time Blue Borders - Intermediate - where you may need to know some beginning concepts before you start Black Borders - Advanced - where you need to master several intermediate concepts before you take these on Our goal is to keep the concepts as \"flat\" as possible without a deep level of dependency. We try to keep at least half of our cards mostly green beginner cards. Students will walk into the AI Racing League and see a stack of cards. They will pick up one card or a set of cards and work on these. When they are done they return the cards and select another set of cards. Because of our Concept Cards in Google Docs Engineering Challenges To develop a world class curriculum, we need to partner with senior engineers and curriculum developers. Here are some of the challenges we need to address. Challenge #1: Make it easy for short term learning Engineers with experience in both hardware and software can build their own DonkeyCar from parts in a few weeks, our goal is to allow students from a wide variety of backgrounds to be able to participate in events in a flexible way. A typical CoderDojo event typically only lasts two hours and students may not have the appropriate background in hardware, Python programming or UNIX. Challenge #2: On site traning hardware Many people that are building DonkeyCars use a standard Mac or PC laptop. These systems take up to two hours to train a typical model - too long for many events. One solution would be to leverage clound-based GPUs to accelerate learning. This option typically requires transferring around 1/2 GB of images up to the clound for training the models. Models, which can typically be 10MB, then need to be transferred back from the clound to the local car. Our challenge here is that many locations may not have high-bandwith uploading and downloading services that could handle this traffic. One solution is to acquire some robust GPUs that students can use to quickly train complex models - typically in 15 to 20 minutes. This hardware needs to be easy to use - for example we need to do folder-based drag and drops and press a single button to begin training.","title":"Learning Strategy"},{"location":"learning-strategy/#ai-racing-league-educational-philosophy","text":"The AI Racing League educational philosophy is founded on the following values: Equal Opportunity - we work hard to keep all AI Racing League activities free and we work hard to encourage girls to be part of our programs. Student driven - we ask each student what their learning goals are and adapt to their needs Project based - we prefer to let students define their own projects and we find resources to support them. If learning about how to get a car to drive by itself that is great, but if they have other objectives we work hard to connect them with the mentor that will help them build whatever they are interested in building. Teamwork - we want students to work in teams so they learn not just about AI, but how to work with others. Flexibility - we want to be known as one of the most flexible learning organizations around. We don't force everyone to learn the same things. We take students in for 20 minutes or two years. We adapt to the needs of our students and we design our curriculum around their needs. Agility - in software there is a strong concept of \"Agile Development\" where team constantly get feedback on what works and adapt their goals every two weeks to meet the needs of their users. We use these same strategies to develop flexible content to meet the ever-changing interests of our students. Our Curriculum is based around building a series of concept cards that adhere to the \"one concept per card\" rule. Each card is a 5.5in X 8in laminated card with questions or challenges on the front and answers on the back. Concept cards have three difficulty levels with different colored borders. Green Borders - Beginner cards that anyone can start with at any time Blue Borders - Intermediate - where you may need to know some beginning concepts before you start Black Borders - Advanced - where you need to master several intermediate concepts before you take these on Our goal is to keep the concepts as \"flat\" as possible without a deep level of dependency. We try to keep at least half of our cards mostly green beginner cards. Students will walk into the AI Racing League and see a stack of cards. They will pick up one card or a set of cards and work on these. When they are done they return the cards and select another set of cards. Because of our Concept Cards in Google Docs","title":"AI Racing League Educational Philosophy"},{"location":"learning-strategy/#engineering-challenges","text":"To develop a world class curriculum, we need to partner with senior engineers and curriculum developers. Here are some of the challenges we need to address.","title":"Engineering Challenges"},{"location":"learning-strategy/#challenge-1-make-it-easy-for-short-term-learning","text":"Engineers with experience in both hardware and software can build their own DonkeyCar from parts in a few weeks, our goal is to allow students from a wide variety of backgrounds to be able to participate in events in a flexible way. A typical CoderDojo event typically only lasts two hours and students may not have the appropriate background in hardware, Python programming or UNIX.","title":"Challenge #1: Make it easy for short term learning"},{"location":"learning-strategy/#challenge-2-on-site-traning-hardware","text":"Many people that are building DonkeyCars use a standard Mac or PC laptop. These systems take up to two hours to train a typical model - too long for many events. One solution would be to leverage clound-based GPUs to accelerate learning. This option typically requires transferring around 1/2 GB of images up to the clound for training the models. Models, which can typically be 10MB, then need to be transferred back from the clound to the local car. Our challenge here is that many locations may not have high-bandwith uploading and downloading services that could handle this traffic. One solution is to acquire some robust GPUs that students can use to quickly train complex models - typically in 15 to 20 minutes. This hardware needs to be easy to use - for example we need to do folder-based drag and drops and press a single button to begin training.","title":"Challenge #2: On site traning hardware"},{"location":"media/","text":"Media Ready, Set, Algorithms! Teams Learn AI by Racing Cars Morningstar, Liberty Mutual workers are coming up with business ideas after exploring machine learning via mini self-driving vehicles","title":"Media"},{"location":"media/#media","text":"Ready, Set, Algorithms! Teams Learn AI by Racing Cars Morningstar, Liberty Mutual workers are coming up with business ideas after exploring machine learning via mini self-driving vehicles","title":"Media"},{"location":"presentations/","text":"AI Racing League Presentations These presentations are all licensed under our creative commons share alike non-commercial with attribution licenses. Welcome to the AI Racing League - slides used for the kickoff of a six week summer camp on building DonkeyCars AI Racing League Code Savvy - presented to out state Minnesota educators in April 2021 November 2019 Update - presentations done in November of 2019 after our fourth \"sprint\" making improvements on our process.","title":"List of Presentations"},{"location":"presentations/#ai-racing-league-presentations","text":"These presentations are all licensed under our creative commons share alike non-commercial with attribution licenses. Welcome to the AI Racing League - slides used for the kickoff of a six week summer camp on building DonkeyCars AI Racing League Code Savvy - presented to out state Minnesota educators in April 2021 November 2019 Update - presentations done in November of 2019 after our fourth \"sprint\" making improvements on our process.","title":"AI Racing League Presentations"},{"location":"resources/","text":"Community Here are some sites that are of interest: CoderDojo Twin Cities - where you can sign up to be a mentor or student Twin Cities AI Racing League Meetup Site - where we announce our public meetings DonkeyCar Hardware DonkeyCar web site Donkey Car Nano Setup Page DonkeyCar Assembly Video - Chris Anderson's detailed assembly video from 2018. Track Options Hardware Options Raspberry Pi 3, 4, the Nvidia Nano, the Nvdia DX2, and the Intel Mobius Neural Stick The base DonkeyCar today uses the Raspberry Pi 3+ which has a list price of $35. This hardware is just barly able to process images in real-time. Small changes in lighting will throw the car off the track. The new Raspberry Pi 4 with 4GB RAM is a new option. The Nvidia Nano on the other hand has 128 CUDA core processors and has more than enough power to drive around a track in real time with varied lighting conditions. This is the hardware we have used for our first generation cars in the AI Racing League. There are also college-level autonomous driving teams that use the more expensive Nvidia DX2 hardware. Nvidia Nano Jetson Nano References Joseph Bastulli PyTorch Nano Nvidia Jetson Developer Kit Nvidia Jetson Nano Kaya Video Adding a Joystick to your DonkeyCar - From Dan McCreary's Blog Videos Video of Wide Track PID Theory and Steering - why using machine learning is easier than setting PID parameters. This is covered in control theory. Real time optimal control of an autonomous RC car with minimum-time maneuvers - nice video of optimization of driving algorithm using a \"U\" shaped track. Sparkfun Autonomous Vehicle Race from 2016 Ed Murphy on Maker Faire","title":"Resources"},{"location":"resources/#community","text":"Here are some sites that are of interest: CoderDojo Twin Cities - where you can sign up to be a mentor or student Twin Cities AI Racing League Meetup Site - where we announce our public meetings","title":"Community"},{"location":"resources/#donkeycar-hardware","text":"DonkeyCar web site Donkey Car Nano Setup Page DonkeyCar Assembly Video - Chris Anderson's detailed assembly video from 2018.","title":"DonkeyCar Hardware"},{"location":"resources/#track-options","text":"","title":"Track Options"},{"location":"resources/#hardware-options","text":"Raspberry Pi 3, 4, the Nvidia Nano, the Nvdia DX2, and the Intel Mobius Neural Stick The base DonkeyCar today uses the Raspberry Pi 3+ which has a list price of $35. This hardware is just barly able to process images in real-time. Small changes in lighting will throw the car off the track. The new Raspberry Pi 4 with 4GB RAM is a new option. The Nvidia Nano on the other hand has 128 CUDA core processors and has more than enough power to drive around a track in real time with varied lighting conditions. This is the hardware we have used for our first generation cars in the AI Racing League. There are also college-level autonomous driving teams that use the more expensive Nvidia DX2 hardware.","title":"Hardware Options"},{"location":"resources/#nvidia-nano","text":"Jetson Nano References Joseph Bastulli PyTorch Nano Nvidia Jetson Developer Kit Nvidia Jetson Nano Kaya Video Adding a Joystick to your DonkeyCar - From Dan McCreary's Blog","title":"Nvidia Nano"},{"location":"resources/#videos","text":"Video of Wide Track PID Theory and Steering - why using machine learning is easier than setting PID parameters. This is covered in control theory. Real time optimal control of an autonomous RC car with minimum-time maneuvers - nice video of optimization of driving algorithm using a \"U\" shaped track. Sparkfun Autonomous Vehicle Race from 2016 Ed Murphy on Maker Faire","title":"Videos"},{"location":"six-week-curriculum/","text":"Sample Six Week Curriculum This is a sample suggested curriculum for a six week AI Racing League summer school project. The students would all meet together for two hours, once a week. There are then homework assignments. The students don't need any prior experience. Week 1: Overview and Unboxing Slides: Welcome to the AI Racing League? Link to Slides What is the DonkeyCar? Lab: Unbox the car (requires tools such as cable tie cutter and screwdrivers) What is AI? What is Machine Learning? What is Python? Introduction to Python course Motors and servos (demo of car driving with the motors and servos being controlled by RC) Make sure students know how to turn on the ESC and listen for the startup beep sound See the suggested parts list for week 1 Week 2: Booting a Raspberry Pi, UNIX, Calibration, Intro to Python and Raspberry Pi Booting a Raspberry Pi from Micro SD card What is a Raspberry Pi? How much RAM do we need? Why is 4GB important for the AI Racing League? What is a micro SD card? How big a card do we need? 32GB vs 65GB vs 128GB Can we train our model on a Pi? Training vs. Inference - when do we need a GPU? What is an Operating System Image file? How do we create an image file? Download a Raspberry Pi image Raspberry Pi Imager Burn a microSD card with that image - include customization Use the microSD card to boot your Raspberry Pi (requires 4GB Raspberry Pi Pico, keyboard, mouse, power supply, monitor) Configure Pi desktop - learn how to use menus, add bookmarks to the web browser, manage bookmarks Start Python IDE Run \"hello world\" in Python Open a Terminal and type \"ls\" Download the DonkeyCar software Get familiar with the folder layout Verify the connections from the Pi to the PWM card and the DonkeyCar Run the calibration command, write down the numbers for throttle and steering Week 3: Python, Configuration, Drive More Python labs - get as far as possible through the Introduction to Python class Get familiar with the Donkey Car configuration file Focus on the key parameters for calibration Find the Drive command Discuss options for controlling the car: Joystick vs Web Application Backup Career Exploration: What is a Software Engineer? Backup Lab: Google Teachable Machines Week 4: Gather Image Data and Analyze Quality with Jupyter Notebooks Drive around the track and gather image data Look at the image data in the tubs Run a basic Python program to count the number of files Learn about a Jupyter Notebook Backup Career Exploration: What is a Data Scientist? Week 5: The GPU and Training Learn about the GPU - what are GPU cores? - Why is training time faster? What is a conda environment for Python? What is Miniconda Download here Activating conda environments Verifying that the GPU setting are correct Run a test program on the GPU Learn how to transfer files from the car's memory to the GPU (compress tubs, copy to jump drive) What is a model file? How big is your model? What are model parameters? Backup: What is Bias in AI? How to we detect it? How dow we measure it? Week 6: Using the Model to Drive Autonomously Put the model file on the Donkey car Run the drive with model command Change the configuration files Evaluate image quality","title":"Sample Six Week Course"},{"location":"six-week-curriculum/#sample-six-week-curriculum","text":"This is a sample suggested curriculum for a six week AI Racing League summer school project. The students would all meet together for two hours, once a week. There are then homework assignments. The students don't need any prior experience.","title":"Sample Six Week Curriculum"},{"location":"six-week-curriculum/#week-1-overview-and-unboxing","text":"Slides: Welcome to the AI Racing League? Link to Slides What is the DonkeyCar? Lab: Unbox the car (requires tools such as cable tie cutter and screwdrivers) What is AI? What is Machine Learning? What is Python? Introduction to Python course Motors and servos (demo of car driving with the motors and servos being controlled by RC) Make sure students know how to turn on the ESC and listen for the startup beep sound See the suggested parts list for week 1","title":"Week 1: Overview and Unboxing"},{"location":"six-week-curriculum/#week-2-booting-a-raspberry-pi-unix-calibration-intro-to-python-and-raspberry-pi","text":"Booting a Raspberry Pi from Micro SD card What is a Raspberry Pi? How much RAM do we need? Why is 4GB important for the AI Racing League? What is a micro SD card? How big a card do we need? 32GB vs 65GB vs 128GB Can we train our model on a Pi? Training vs. Inference - when do we need a GPU? What is an Operating System Image file? How do we create an image file? Download a Raspberry Pi image Raspberry Pi Imager Burn a microSD card with that image - include customization Use the microSD card to boot your Raspberry Pi (requires 4GB Raspberry Pi Pico, keyboard, mouse, power supply, monitor) Configure Pi desktop - learn how to use menus, add bookmarks to the web browser, manage bookmarks Start Python IDE Run \"hello world\" in Python Open a Terminal and type \"ls\" Download the DonkeyCar software Get familiar with the folder layout Verify the connections from the Pi to the PWM card and the DonkeyCar Run the calibration command, write down the numbers for throttle and steering","title":"Week 2: Booting a Raspberry Pi, UNIX, Calibration, Intro to Python and Raspberry Pi"},{"location":"six-week-curriculum/#week-3-python-configuration-drive","text":"More Python labs - get as far as possible through the Introduction to Python class Get familiar with the Donkey Car configuration file Focus on the key parameters for calibration Find the Drive command Discuss options for controlling the car: Joystick vs Web Application Backup Career Exploration: What is a Software Engineer? Backup Lab: Google Teachable Machines","title":"Week 3: Python, Configuration, Drive"},{"location":"six-week-curriculum/#week-4-gather-image-data-and-analyze-quality-with-jupyter-notebooks","text":"Drive around the track and gather image data Look at the image data in the tubs Run a basic Python program to count the number of files Learn about a Jupyter Notebook Backup Career Exploration: What is a Data Scientist?","title":"Week 4: Gather Image Data and Analyze Quality with Jupyter Notebooks"},{"location":"six-week-curriculum/#week-5-the-gpu-and-training","text":"Learn about the GPU - what are GPU cores? - Why is training time faster? What is a conda environment for Python? What is Miniconda Download here Activating conda environments Verifying that the GPU setting are correct Run a test program on the GPU Learn how to transfer files from the car's memory to the GPU (compress tubs, copy to jump drive) What is a model file? How big is your model? What are model parameters? Backup: What is Bias in AI? How to we detect it? How dow we measure it?","title":"Week 5: The GPU and Training"},{"location":"six-week-curriculum/#week-6-using-the-model-to-drive-autonomously","text":"Put the model file on the Donkey car Run the drive with model command Change the configuration files Evaluate image quality","title":"Week 6: Using the Model to Drive Autonomously"},{"location":"admin/01-intro/","text":"League Administers Page SD Image This section show how leage administrators can create their own SD image files.","title":"Introduction"},{"location":"admin/01-intro/#league-administers-page","text":"","title":"League Administers Page"},{"location":"admin/01-intro/#sd-image","text":"This section show how leage administrators can create their own SD image files.","title":"SD Image"},{"location":"admin/02-sd-image/","text":"Creating a League SD Image Many times teams will not have the time to build their own image during the time allocated for an event. It typically takes 2-4 hours to create a DonkeyCar image that is ready to drive. To get around this problem, leagues frequently create their own \"reference image\" that are given to teams. Checklist for the League Image Bookmark bar in the browser is visible (check Show Bookmarks Bar) Bookmark bar is populated with: You League Homepage (use GitHub Pages and mkdocs for best pratices) Links to Team pages with sample myconfig.py files for each team's car Link to the AI Racing League site (https://www.coderdojotc.org/ai-racing-league/) Links to the DonkeyCar site Links to the Raspberry Pi or NVIDIA Nano site All operating system files updates before match Auto-update disabled - you don't what gigabyte uploads when people insert their image All Python libraries Updates Verify Python release such as Python 3.7 using python --version Run \"pip freeze\" to get a list of the libraries you have tested on All DonkeyCar libraries updated In the \"donkeycar\" repo run a \"git pull\" to update the latest code Make sure you ONLY change the myconfig.py - changes to config.py will be lost ## Things to Remove from your Image Personal information (from your github file in .gitinfo) Change Hostname to be Generic (arl) Remove your home or school default wifi settings Burning an League Reference Image Take the image out of your car Take it to a Mac/PC and copy the image to your harddrive using the dd Command Insert a black MicroSD card Copy the image on your PC's Harddrive to the new MicroSD Using DD or a GUI tool like belana Etcher Using the GNome Partition Editor (gpartd) Reference DonkeyCar Release Process","title":"Custom Club Images"},{"location":"admin/02-sd-image/#creating-a-league-sd-image","text":"Many times teams will not have the time to build their own image during the time allocated for an event. It typically takes 2-4 hours to create a DonkeyCar image that is ready to drive. To get around this problem, leagues frequently create their own \"reference image\" that are given to teams.","title":"Creating a League SD Image"},{"location":"admin/02-sd-image/#checklist-for-the-league-image","text":"Bookmark bar in the browser is visible (check Show Bookmarks Bar) Bookmark bar is populated with: You League Homepage (use GitHub Pages and mkdocs for best pratices) Links to Team pages with sample myconfig.py files for each team's car Link to the AI Racing League site (https://www.coderdojotc.org/ai-racing-league/) Links to the DonkeyCar site Links to the Raspberry Pi or NVIDIA Nano site All operating system files updates before match Auto-update disabled - you don't what gigabyte uploads when people insert their image All Python libraries Updates Verify Python release such as Python 3.7 using python --version Run \"pip freeze\" to get a list of the libraries you have tested on All DonkeyCar libraries updated In the \"donkeycar\" repo run a \"git pull\" to update the latest code Make sure you ONLY change the myconfig.py - changes to config.py will be lost ## Things to Remove from your Image Personal information (from your github file in .gitinfo) Change Hostname to be Generic (arl) Remove your home or school default wifi settings","title":"Checklist for the League Image"},{"location":"admin/02-sd-image/#burning-an-league-reference-image","text":"Take the image out of your car Take it to a Mac/PC and copy the image to your harddrive using the dd Command Insert a black MicroSD card Copy the image on your PC's Harddrive to the new MicroSD Using DD or a GUI tool like belana Etcher","title":"Burning an League Reference Image"},{"location":"admin/02-sd-image/#using-the-gnome-partition-editor-gpartd","text":"","title":"Using the GNome Partition Editor (gpartd)"},{"location":"admin/02-sd-image/#reference","text":"DonkeyCar Release Process","title":"Reference"},{"location":"admin/03-purchasing-guide/","text":"AI Racing League Purchasing Guide DonkeyCars Microcontrollers Raspberry Pi NVIDIA Nano GPUs !!! Note The AI Racing League ONLY uses this for training our models. We don't need elaborate CPU overclocking and a water cooled CPU. We don't need powerful CPU and lots of RAM. We just need to be able to train a 20K image model within around 5-10 minutes. Most GPUs can do this. Portable Case We wanted a small lightweight case with a handle and tempered glass sides so our teams can see what is inside. The price is around $110.00. Lian Li TU150 Mini ITX Desktop Case Motherboard RAM GPU Solid State Drive","title":"Purchasing Guide"},{"location":"admin/03-purchasing-guide/#ai-racing-league-purchasing-guide","text":"","title":"AI Racing League Purchasing Guide"},{"location":"admin/03-purchasing-guide/#donkeycars","text":"","title":"DonkeyCars"},{"location":"admin/03-purchasing-guide/#microcontrollers","text":"","title":"Microcontrollers"},{"location":"admin/03-purchasing-guide/#raspberry-pi","text":"","title":"Raspberry Pi"},{"location":"admin/03-purchasing-guide/#nvidia-nano","text":"","title":"NVIDIA Nano"},{"location":"admin/03-purchasing-guide/#gpus","text":"!!! Note The AI Racing League ONLY uses this for training our models. We don't need elaborate CPU overclocking and a water cooled CPU. We don't need powerful CPU and lots of RAM. We just need to be able to train a 20K image model within around 5-10 minutes. Most GPUs can do this.","title":"GPUs"},{"location":"admin/03-purchasing-guide/#portable-case","text":"We wanted a small lightweight case with a handle and tempered glass sides so our teams can see what is inside. The price is around $110.00. Lian Li TU150 Mini ITX Desktop Case","title":"Portable Case"},{"location":"admin/03-purchasing-guide/#motherboard","text":"","title":"Motherboard"},{"location":"admin/03-purchasing-guide/#ram","text":"","title":"RAM"},{"location":"admin/03-purchasing-guide/#gpu","text":"","title":"GPU"},{"location":"admin/03-purchasing-guide/#solid-state-drive","text":"","title":"Solid State Drive"},{"location":"admin/car-box-checklist/","text":"AI Racing League Car Box Checklist Donkey Car NVIDIA Kit Car Name: _ _ _ _ Mac Address: _ _ _ _ Static IP Address: _ _ _ [ ] RC Car with the following components [ ] RC Car Battery Charger (7.2v NiMh) [ ] Pi Camera Module V2 with 3D printed chassis [ ] 128GB micro SD card (inserted in Nvidia Nano) (2) [ ] RC Car Battery (7.2v NiMh) [ ] Nvidia Nano with 4GB RAM [ ] Ankar 5v 6800mHA battery with charging cable - note draws 900ma when charging so use a 1ft high current USB cable. [ ] 2.5 amp 5v barrel connector for desktop use of Nvidia [ ] Jumper for enabling the barrele connector [ ] WiFi Dongle (plugged into the car) or AC8265 [ ] Logitech F710 Joystick (dongle plugged into the car) - names on both Joystick and dongle [ ] Mouse Optional Accessories (not in the box) 1. [ ] Keyboard 1. [ ] External Monitor Nvidia Nano Serial Number: _ _ _ _____ Nvidia Nano Purchase Date: December 12, 2019 Raspberry Pi DonkeyCar Kit [ ] RC Car with separate ESC and Servo Connectors [ ] RC Car Battery Charger (7.2v NiMh) [ ] 7.2 volt battery with Tamiya connector [ ] 3D Printed Chassis [ ] with 3 large screws for roll-bar to base [ ] 8 smaller screws for attaching the PI and PWM board to base [ ] Raspberry Pi [ ] Board with 4GB RAM [ ] 3A Power with USB C Connector [ ] Keyboard [ ] Mouse [ ] VGA Connector [ ] PWM Board [ ] Camera [ ] 4 Female-Female Dupont Connectors [ ] USB Battery Pack (6,000 to 10,000 milliamp hours) [ ] 1 ft USB A to USB C [ ] Extra 7.2 volt battery for RC Car with mini Tamiya Miscellaneous Parts Digital Volt-Ohm Meter ($10) Extra Tamiya Style Connectors Amazon Link","title":"Car Box Checklist"},{"location":"admin/car-box-checklist/#ai-racing-league-car-box-checklist","text":"","title":"AI Racing League Car Box Checklist"},{"location":"admin/car-box-checklist/#donkey-car-nvidia-kit","text":"Car Name: _ _ _ _ Mac Address: _ _ _ _ Static IP Address: _ _ _ [ ] RC Car with the following components [ ] RC Car Battery Charger (7.2v NiMh) [ ] Pi Camera Module V2 with 3D printed chassis [ ] 128GB micro SD card (inserted in Nvidia Nano) (2) [ ] RC Car Battery (7.2v NiMh) [ ] Nvidia Nano with 4GB RAM [ ] Ankar 5v 6800mHA battery with charging cable - note draws 900ma when charging so use a 1ft high current USB cable. [ ] 2.5 amp 5v barrel connector for desktop use of Nvidia [ ] Jumper for enabling the barrele connector [ ] WiFi Dongle (plugged into the car) or AC8265 [ ] Logitech F710 Joystick (dongle plugged into the car) - names on both Joystick and dongle [ ] Mouse Optional Accessories (not in the box) 1. [ ] Keyboard 1. [ ] External Monitor Nvidia Nano Serial Number: _ _ _ _____ Nvidia Nano Purchase Date: December 12, 2019","title":"Donkey Car NVIDIA Kit"},{"location":"admin/car-box-checklist/#raspberry-pi-donkeycar-kit","text":"[ ] RC Car with separate ESC and Servo Connectors [ ] RC Car Battery Charger (7.2v NiMh) [ ] 7.2 volt battery with Tamiya connector [ ] 3D Printed Chassis [ ] with 3 large screws for roll-bar to base [ ] 8 smaller screws for attaching the PI and PWM board to base [ ] Raspberry Pi [ ] Board with 4GB RAM [ ] 3A Power with USB C Connector [ ] Keyboard [ ] Mouse [ ] VGA Connector [ ] PWM Board [ ] Camera [ ] 4 Female-Female Dupont Connectors [ ] USB Battery Pack (6,000 to 10,000 milliamp hours) [ ] 1 ft USB A to USB C [ ] Extra 7.2 volt battery for RC Car with mini Tamiya","title":"Raspberry Pi DonkeyCar Kit"},{"location":"admin/car-box-checklist/#miscellaneous-parts","text":"Digital Volt-Ohm Meter ($10) Extra Tamiya Style Connectors Amazon Link","title":"Miscellaneous Parts"},{"location":"admin/car-parts-list/","text":"DonkeyCar Nvidia Nano Parts List We have looked at many variations of parts and decided to go with the Nvidia Nano, a TP-Link WiFi dongle and the Logitech F710 Joystick. Here are our recomended parts. We are also looking into getting the wide-angle (160 degree) cameras but we have not tested these enough. Part Name Description Price Link Note 128GB microSD card Samsung 128GB 100MB/s (U3) MicroSDXC Evo Select Memory Card with Adapter (MB-ME128GA/AM) $20 https://www.amazon.com/Samsung-MicroSD-Adapter-MB-ME128GA-AM/dp/B06XWZWYVP MicroCenter in St. Louis Park has these for about 1/2 the prices Camera Raspberry Pi Camera Module V2-8 Megapixel,1080p $30 https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS MUST be Module V2. The V1 will NOT work with the Nano. Dupont Connectors (F-F) EDGELEC 120pcs 20cm Dupont Wire Female to Female Breadboard Jumper Wires 3.9 inch 1pin-1pin 2.54mm Connector Multicolored Ribbon Cables DIY Arduino Wires 10 15 20 30 40 50 100cm Optional $8 for 120 https://www.amazon.com/EDGELEC-Breadboard-1pin-1pin-Connector-Multicolored/dp/B07GCY6CH7 Only need one of these Nvidia Nano Single Board Computer NVIDIA Jetson Nano Developer Kit $99 https://www.amazon.com/NVIDIA-Jetson-Nano-Developer-Kit/dp/B07PZHBDKT Ships in two days Power for Pi - 6700mAh Anker [Upgraded to 6700mAh] Astro E1 Candy-Bar Sized Ultra Compact Portable Charger, External Battery Power Bank, with High-Speed Charging PowerIQ Technology $24 https://www.amazon.com/Anker-Upgraded-Candy-Bar-High-Speed-Technology/dp/B06XS9RMWS I like this one but there are other variations. Some are rated at 10,000 mAh Power Supply for Nano SMAKN DC 5V/4A 20W Switching Power Supply Adapter 100-240 Ac(US) $10 https://www.amazon.com/SMAKN-Switching-Supply-Adapter-100-240/dp/B01N4HYWAM Note that this is a 4A 12V power supply. RC Car 1/16 2.4Ghz Exceed RC Magnet Electric Powered RTR Off Road Truck Stripe Blue NEW $119 https://www.ebay.com/itm/1-16-2-4Ghz-Exceed-RC-Magnet-Electric-Powered-RTR-Off-Road-Truck-Stripe-Blue-NEW/223337258165 E-Bay Wifi USB Dongle N150 USB wireless WiFi network Adapter for PC with SoftAP Mode - Nano Size, Compatible with Linux Kernal 2.6.18~4.4.3 (TL-WN725N) $7 https://www.amazon.com/TP-Link-TL-WN725N-wireless-network-Adapter/dp/B008IFXQFU/ I purchased one at Microcenter and it worked out-of-the-box on the Nano. The Ubuntu drivers are pre-loaded! Servo Module HiLetgo 2pcs PCA9685 16 Channel 12-Bit PWM Servo Motor Driver IIC Module for Arduino Robot $10 for 2 https://www.amazon.com/gp/product/B07BRS249H/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 Note the quantity is 2 USB Power Cable Anker [4-Pack] Powerline Micro USB (1ft) - Charging Cable $10 for 4 https://www.amazon.com/gp/product/B015XR60MQ/ref=ppx_yo_dt_b_asin_title_o02_s00 Note the quantity is 4 but you only need one Replacement Battery 7.2V 1100mAh 6x 2/3A Rechargeable Ni-MH RC Battery Pack w/Small Tamiya Connector 10cmX3cmX1.5cm $9.88 + $2.39 Shipping https://www.ebay.com/i/183877810537 Takes several weeks to ship from China. We are looking for a local supplier. Some replacements (Airsoft guns) have reverse polarity.","title":"Cars Parts List"},{"location":"admin/car-parts-list/#donkeycar-nvidia-nano-parts-list","text":"We have looked at many variations of parts and decided to go with the Nvidia Nano, a TP-Link WiFi dongle and the Logitech F710 Joystick. Here are our recomended parts. We are also looking into getting the wide-angle (160 degree) cameras but we have not tested these enough. Part Name Description Price Link Note 128GB microSD card Samsung 128GB 100MB/s (U3) MicroSDXC Evo Select Memory Card with Adapter (MB-ME128GA/AM) $20 https://www.amazon.com/Samsung-MicroSD-Adapter-MB-ME128GA-AM/dp/B06XWZWYVP MicroCenter in St. Louis Park has these for about 1/2 the prices Camera Raspberry Pi Camera Module V2-8 Megapixel,1080p $30 https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS MUST be Module V2. The V1 will NOT work with the Nano. Dupont Connectors (F-F) EDGELEC 120pcs 20cm Dupont Wire Female to Female Breadboard Jumper Wires 3.9 inch 1pin-1pin 2.54mm Connector Multicolored Ribbon Cables DIY Arduino Wires 10 15 20 30 40 50 100cm Optional $8 for 120 https://www.amazon.com/EDGELEC-Breadboard-1pin-1pin-Connector-Multicolored/dp/B07GCY6CH7 Only need one of these Nvidia Nano Single Board Computer NVIDIA Jetson Nano Developer Kit $99 https://www.amazon.com/NVIDIA-Jetson-Nano-Developer-Kit/dp/B07PZHBDKT Ships in two days Power for Pi - 6700mAh Anker [Upgraded to 6700mAh] Astro E1 Candy-Bar Sized Ultra Compact Portable Charger, External Battery Power Bank, with High-Speed Charging PowerIQ Technology $24 https://www.amazon.com/Anker-Upgraded-Candy-Bar-High-Speed-Technology/dp/B06XS9RMWS I like this one but there are other variations. Some are rated at 10,000 mAh Power Supply for Nano SMAKN DC 5V/4A 20W Switching Power Supply Adapter 100-240 Ac(US) $10 https://www.amazon.com/SMAKN-Switching-Supply-Adapter-100-240/dp/B01N4HYWAM Note that this is a 4A 12V power supply. RC Car 1/16 2.4Ghz Exceed RC Magnet Electric Powered RTR Off Road Truck Stripe Blue NEW $119 https://www.ebay.com/itm/1-16-2-4Ghz-Exceed-RC-Magnet-Electric-Powered-RTR-Off-Road-Truck-Stripe-Blue-NEW/223337258165 E-Bay Wifi USB Dongle N150 USB wireless WiFi network Adapter for PC with SoftAP Mode - Nano Size, Compatible with Linux Kernal 2.6.18~4.4.3 (TL-WN725N) $7 https://www.amazon.com/TP-Link-TL-WN725N-wireless-network-Adapter/dp/B008IFXQFU/ I purchased one at Microcenter and it worked out-of-the-box on the Nano. The Ubuntu drivers are pre-loaded! Servo Module HiLetgo 2pcs PCA9685 16 Channel 12-Bit PWM Servo Motor Driver IIC Module for Arduino Robot $10 for 2 https://www.amazon.com/gp/product/B07BRS249H/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 Note the quantity is 2 USB Power Cable Anker [4-Pack] Powerline Micro USB (1ft) - Charging Cable $10 for 4 https://www.amazon.com/gp/product/B015XR60MQ/ref=ppx_yo_dt_b_asin_title_o02_s00 Note the quantity is 4 but you only need one Replacement Battery 7.2V 1100mAh 6x 2/3A Rechargeable Ni-MH RC Battery Pack w/Small Tamiya Connector 10cmX3cmX1.5cm $9.88 + $2.39 Shipping https://www.ebay.com/i/183877810537 Takes several weeks to ship from China. We are looking for a local supplier. Some replacements (Airsoft guns) have reverse polarity.","title":"DonkeyCar Nvidia Nano Parts List"},{"location":"admin/gpu-parts/","text":"AI Racing League GPU Components Design Goals We wanted to create a local training system that had fast training times but was portable so that we can easily carry it in a car and ship it to remote events. We can't assume any connectivity to the Internet for our events since some of them might be held in parking lots with no network access. Here are our design objectives. We also drive to remote events and the equipment needs to be outside overnight in freezing weather. This rules out using any water-cooled hardware which gets easily damaged in freezing weather. Fast Training Times We want students to be able to drive around a track 20 times (10 times clockwise and 10 times counterclockwise) and generate a reasonable sized data set of 20 frames per second and 224X224 images. This ends up being about 10,000 images. The sizes are a bit larger for larger tracks and slower drivers. Why We Like the NVIDIA RTX 2070 We want to train with this data set in under five minutes. This means that we want to use a GPU card that has about 2000 CUDA cores. An example of this is the Nvidia GeForce GTX graphic cards. The RTX 2070 which currently has a list price of around $500. There are many people that are upgrading their video game systems and are selling these GPUs used on eBay and Craigslist.com for a few hundred dollars. A higher cost option is the NVIDIA RTX 2080 which has a retail list price of around $1,200 USD. The benchmarks for image training for these two boards were done by Dr Donald Kinghorn in March of 2019. [His analysis] (https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/) shows that a single GTX 2080 Ti can process about 293 images per second. The GTX 2070 only does about 191 images per second. But for about 1/3 of the price it is still a good value. Small and Lightweight We originally were \"gifted\" a somewhat old GPU server used in a data center for training deep learning models. Although the sever was \"free\", it was over 70 pounds and had far more capability for RAM and power then we needed at events. Based in this experience we opted to build a much smaller system using a mini enclosure with a handle. We selected the Mini ITX Desktop Case and determined that we could still fit the GPU in this case. Rugged Must be able to take the bumps of shipping and be able to be left out in a car overnight in freezing temperatures. This was a requirement for remote events in rural Minnesota communities. We opted for a full SSD drive to keep the moving parts to a minimum. Easy to ship to remote sites We had to be able to put the unit is a remote shipping case. We are still looking for low-cost cases that are lightweight but protective. Visibility We wanted students to be able to look into the case and see the parts. There is a trend to also purchase RGB LED versions of components which we thought we could program to change from RED to Green during the training process as the model converges. We have not found a good API for the parts so a simple $5 LED strip on a Arduino Nano might be a better idea. See the Moving Rainbow project for sample designs. We create these at the IoT hackthons each year. Sample Parts List Part Name Description Price Link Note CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $189.99 Motherboard Gigabyte X570 I AORUS PRO WIFI Mini ITX AM4 $219.99 RAM Corsair Vengeance RGB Pro 32 GB (2 x 16 GB) DDR4-3200 Memory $162.99 Link Notes Storage Gigabyte AORUS NVMe Gen4 1 TB M.2-2280 NVME Solid State Drive $209.99 Link Notes Cooling Be quiet! Dark Rock Pro 4, BK022, 250W TDP $89.90 https://www.amazon.com/dp/B07BY6F8D9/ref=cm_sw_r_cp_api_i_PYp-DbFCY51CH Avoid liquid cooler GPU Card NVIDIA GeForce RTX 2070 Ti 8 GB $499.99 https://www.nvidia.com/en-us/geforce/graphics-cards/rtx-2070-super/ $500 price is a lower cost alternative Case Lian Li TU150 Mini ITX Desktop Case $109.99 Link We love the handle on this small case and the glass side panel. Power Supply Corsair SF 600W 80+ Gold SFX Power Supply $114.99 Link 600W is an overkill Note that this motherboard does come with builtin WiFi. The external antenna must be connected but it is easy to get lost in transport. You might want to get a few additional WiFi antennas like these RP-SMA Male Antenna We also think we could get buy with a smaller and lighter power supply, but the 600W model gives the system the opportunity to add external devices that might draw more power. Assembly There are several good videos on YouTube that show how to assemble custom systems. You can also use a search engine to find videos for each of the parts. The Liquid coolers can be tricky to install correctly if you don't have experience. We also recommend reading the user manauals for each of the parts. They are usually on line. Jon Herke's Tiny Monster Installing NVIDIA Drivers on Ubuntu Installing NVIDIA drivers on Ubuntu is notoriously painful and difficult. One mis-step and you can't get to the monitor and have to ssh in to fix things. Make sure to setup ssh before you install the NVIDIA drivers. We used the UNIX command line to install the NVIDIA drivers. The GUI tool on Ubuntu did not work for us in some settings. See NVIDIA Driver Install . A guide to do this is here: Installation of Nvidia Drivers on Ubuntu 18","title":"GPU Parts List"},{"location":"admin/gpu-parts/#ai-racing-league-gpu-components","text":"","title":"AI Racing League GPU Components"},{"location":"admin/gpu-parts/#design-goals","text":"We wanted to create a local training system that had fast training times but was portable so that we can easily carry it in a car and ship it to remote events. We can't assume any connectivity to the Internet for our events since some of them might be held in parking lots with no network access. Here are our design objectives. We also drive to remote events and the equipment needs to be outside overnight in freezing weather. This rules out using any water-cooled hardware which gets easily damaged in freezing weather.","title":"Design Goals"},{"location":"admin/gpu-parts/#fast-training-times","text":"We want students to be able to drive around a track 20 times (10 times clockwise and 10 times counterclockwise) and generate a reasonable sized data set of 20 frames per second and 224X224 images. This ends up being about 10,000 images. The sizes are a bit larger for larger tracks and slower drivers.","title":"Fast Training Times"},{"location":"admin/gpu-parts/#why-we-like-the-nvidia-rtx-2070","text":"We want to train with this data set in under five minutes. This means that we want to use a GPU card that has about 2000 CUDA cores. An example of this is the Nvidia GeForce GTX graphic cards. The RTX 2070 which currently has a list price of around $500. There are many people that are upgrading their video game systems and are selling these GPUs used on eBay and Craigslist.com for a few hundred dollars. A higher cost option is the NVIDIA RTX 2080 which has a retail list price of around $1,200 USD. The benchmarks for image training for these two boards were done by Dr Donald Kinghorn in March of 2019. [His analysis] (https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/) shows that a single GTX 2080 Ti can process about 293 images per second. The GTX 2070 only does about 191 images per second. But for about 1/3 of the price it is still a good value.","title":"Why We Like the NVIDIA RTX 2070"},{"location":"admin/gpu-parts/#small-and-lightweight","text":"We originally were \"gifted\" a somewhat old GPU server used in a data center for training deep learning models. Although the sever was \"free\", it was over 70 pounds and had far more capability for RAM and power then we needed at events. Based in this experience we opted to build a much smaller system using a mini enclosure with a handle. We selected the Mini ITX Desktop Case and determined that we could still fit the GPU in this case.","title":"Small and Lightweight"},{"location":"admin/gpu-parts/#rugged","text":"Must be able to take the bumps of shipping and be able to be left out in a car overnight in freezing temperatures. This was a requirement for remote events in rural Minnesota communities. We opted for a full SSD drive to keep the moving parts to a minimum.","title":"Rugged"},{"location":"admin/gpu-parts/#easy-to-ship-to-remote-sites","text":"We had to be able to put the unit is a remote shipping case. We are still looking for low-cost cases that are lightweight but protective.","title":"Easy to ship to remote sites"},{"location":"admin/gpu-parts/#visibility","text":"We wanted students to be able to look into the case and see the parts. There is a trend to also purchase RGB LED versions of components which we thought we could program to change from RED to Green during the training process as the model converges. We have not found a good API for the parts so a simple $5 LED strip on a Arduino Nano might be a better idea. See the Moving Rainbow project for sample designs. We create these at the IoT hackthons each year.","title":"Visibility"},{"location":"admin/gpu-parts/#sample-parts-list","text":"Part Name Description Price Link Note CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $189.99 Motherboard Gigabyte X570 I AORUS PRO WIFI Mini ITX AM4 $219.99 RAM Corsair Vengeance RGB Pro 32 GB (2 x 16 GB) DDR4-3200 Memory $162.99 Link Notes Storage Gigabyte AORUS NVMe Gen4 1 TB M.2-2280 NVME Solid State Drive $209.99 Link Notes Cooling Be quiet! Dark Rock Pro 4, BK022, 250W TDP $89.90 https://www.amazon.com/dp/B07BY6F8D9/ref=cm_sw_r_cp_api_i_PYp-DbFCY51CH Avoid liquid cooler GPU Card NVIDIA GeForce RTX 2070 Ti 8 GB $499.99 https://www.nvidia.com/en-us/geforce/graphics-cards/rtx-2070-super/ $500 price is a lower cost alternative Case Lian Li TU150 Mini ITX Desktop Case $109.99 Link We love the handle on this small case and the glass side panel. Power Supply Corsair SF 600W 80+ Gold SFX Power Supply $114.99 Link 600W is an overkill Note that this motherboard does come with builtin WiFi. The external antenna must be connected but it is easy to get lost in transport. You might want to get a few additional WiFi antennas like these RP-SMA Male Antenna We also think we could get buy with a smaller and lighter power supply, but the 600W model gives the system the opportunity to add external devices that might draw more power.","title":"Sample Parts List"},{"location":"admin/gpu-parts/#assembly","text":"There are several good videos on YouTube that show how to assemble custom systems. You can also use a search engine to find videos for each of the parts. The Liquid coolers can be tricky to install correctly if you don't have experience. We also recommend reading the user manauals for each of the parts. They are usually on line. Jon Herke's Tiny Monster","title":"Assembly"},{"location":"admin/gpu-parts/#installing-nvidia-drivers-on-ubuntu","text":"Installing NVIDIA drivers on Ubuntu is notoriously painful and difficult. One mis-step and you can't get to the monitor and have to ssh in to fix things. Make sure to setup ssh before you install the NVIDIA drivers. We used the UNIX command line to install the NVIDIA drivers. The GUI tool on Ubuntu did not work for us in some settings. See NVIDIA Driver Install . A guide to do this is here: Installation of Nvidia Drivers on Ubuntu 18","title":"Installing NVIDIA Drivers on Ubuntu"},{"location":"admin/gpu-shell/","text":"Shell Commands for the GPU Server The following is a list of shell commands for the AI Racing League GPU Server. We have moved all the commands for setting up the NVIDIA GPU to the file NVIDIA Driver Install . The samples below are run if you are on the GPU running the Terminal shell or you have logged on using the secure shell program. Secure Shell Login ```linenums=\"0\" $ ssh arl@arl1.local 1 2 3 4 ## Check the Version of Ubuntu ```sh $ lsb_release -a Response: 1 2 3 4 5 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic List the CPU Information 1 lscpu Response: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Architecture : x86_64 CPU op - mode ( s ): 32 - bit , 64 - bit Byte Order : Little Endian CPU ( s ): 12 On - line CPU ( s ) list : 0 - 11 Thread ( s ) per core : 2 Core ( s ) per socket : 6 Socket ( s ): 1 NUMA node ( s ): 1 Vendor ID : AuthenticAMD CPU family : 23 Model : 113 Model name : AMD Ryzen 5 3600 6 - Core Processor Stepping : 0 CPU MHz : 2195.902 CPU max MHz : 3600.0000 CPU min MHz : 2200.0000 BogoMIPS : 7187.07 Virtualization : AMD - V L1d cache : 32 K L1i cache : 32 K L2 cache : 512 K L3 cache : 16384 K NUMA node0 CPU ( s ): 0 - 11 Flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3 dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca The key is that we have 12 CPUs and each CPU has two threads. That means that we have 24 threads that run concurrent operations on this server. This is plenty of capacity for our GPU server. RAM 1 free -m Response: 1 2 3 total used free shared buff/cache available Mem: 32124 1627 28879 75 1618 30019 Swap: 2047 0 2047 This indicates we have 32 GB RAM. The GPU server should have a minimum of 8 GB of RAM. Disk Space 1 df -h / Response: 1 2 Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p3 229G 178G 40G 82% / This shows we have a total of 229 gigabytes of RAM and we have 40 gigabytes available. We will need about 4 GB for each training set we store. Per User Disk Usage 1 du -hs /home/* 2 >/dev/null Response: 1 2 3 4 8.5 G / home / arl 1.4 G / home / dan 16 K / home / dan2 155 G / home / donkey Add A New GPU Server User 1 adduser donkey You can also allow the user to have \"sudo\" rights by using the following command: 1 sudo usermod -aG sudo donkey Change the Hostname 1 sudo vi hostname Change the name to \"gpu-server2\" or a similar name. NVIDIA GPU Monitor The runs similar to the UNIX top command, but for the GPU. 1 watch -d -n 0 .5 nvidia-smi NVIDIA GPU Utilization This shows the GPU running at 42% utilization during the training process. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 nvidia-smi Mon Jul 26 20:24:16 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 On | N/A | | 41% 49C P2 136W / 260W | 10892MiB / 11016MiB | 42% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 155MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 32MiB | | 0 N/A N/A 23722 G ...AAAAAAAAA= --shared-files 25MiB | | 0 N/A N/A 27071 G ...AAAAAAAAA= --shared-files 9MiB | | 0 N/A N/A 32486 C ...a3/envs/donkey/bin/python 10571MiB | +-----------------------------------------------------------------------------+","title":"GPU Shell Commands"},{"location":"admin/gpu-shell/#shell-commands-for-the-gpu-server","text":"The following is a list of shell commands for the AI Racing League GPU Server. We have moved all the commands for setting up the NVIDIA GPU to the file NVIDIA Driver Install . The samples below are run if you are on the GPU running the Terminal shell or you have logged on using the secure shell program.","title":"Shell Commands for the GPU Server"},{"location":"admin/gpu-shell/#secure-shell-login","text":"```linenums=\"0\" $ ssh arl@arl1.local 1 2 3 4 ## Check the Version of Ubuntu ```sh $ lsb_release -a Response: 1 2 3 4 5 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic","title":"Secure Shell Login"},{"location":"admin/gpu-shell/#list-the-cpu-information","text":"1 lscpu Response: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Architecture : x86_64 CPU op - mode ( s ): 32 - bit , 64 - bit Byte Order : Little Endian CPU ( s ): 12 On - line CPU ( s ) list : 0 - 11 Thread ( s ) per core : 2 Core ( s ) per socket : 6 Socket ( s ): 1 NUMA node ( s ): 1 Vendor ID : AuthenticAMD CPU family : 23 Model : 113 Model name : AMD Ryzen 5 3600 6 - Core Processor Stepping : 0 CPU MHz : 2195.902 CPU max MHz : 3600.0000 CPU min MHz : 2200.0000 BogoMIPS : 7187.07 Virtualization : AMD - V L1d cache : 32 K L1i cache : 32 K L2 cache : 512 K L3 cache : 16384 K NUMA node0 CPU ( s ): 0 - 11 Flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3 dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca The key is that we have 12 CPUs and each CPU has two threads. That means that we have 24 threads that run concurrent operations on this server. This is plenty of capacity for our GPU server.","title":"List the CPU Information"},{"location":"admin/gpu-shell/#ram","text":"1 free -m Response: 1 2 3 total used free shared buff/cache available Mem: 32124 1627 28879 75 1618 30019 Swap: 2047 0 2047 This indicates we have 32 GB RAM. The GPU server should have a minimum of 8 GB of RAM.","title":"RAM"},{"location":"admin/gpu-shell/#disk-space","text":"1 df -h / Response: 1 2 Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p3 229G 178G 40G 82% / This shows we have a total of 229 gigabytes of RAM and we have 40 gigabytes available. We will need about 4 GB for each training set we store.","title":"Disk Space"},{"location":"admin/gpu-shell/#per-user-disk-usage","text":"1 du -hs /home/* 2 >/dev/null Response: 1 2 3 4 8.5 G / home / arl 1.4 G / home / dan 16 K / home / dan2 155 G / home / donkey","title":"Per User Disk Usage"},{"location":"admin/gpu-shell/#add-a-new-gpu-server-user","text":"1 adduser donkey You can also allow the user to have \"sudo\" rights by using the following command: 1 sudo usermod -aG sudo donkey","title":"Add A New GPU Server User"},{"location":"admin/gpu-shell/#change-the-hostname","text":"1 sudo vi hostname Change the name to \"gpu-server2\" or a similar name.","title":"Change the Hostname"},{"location":"admin/gpu-shell/#nvidia-gpu-monitor","text":"The runs similar to the UNIX top command, but for the GPU. 1 watch -d -n 0 .5 nvidia-smi","title":"NVIDIA GPU Monitor"},{"location":"admin/gpu-shell/#nvidia-gpu-utilization","text":"This shows the GPU running at 42% utilization during the training process. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 nvidia-smi Mon Jul 26 20:24:16 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 On | N/A | | 41% 49C P2 136W / 260W | 10892MiB / 11016MiB | 42% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 155MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 32MiB | | 0 N/A N/A 23722 G ...AAAAAAAAA= --shared-files 25MiB | | 0 N/A N/A 27071 G ...AAAAAAAAA= --shared-files 9MiB | | 0 N/A N/A 32486 C ...a3/envs/donkey/bin/python 10571MiB | +-----------------------------------------------------------------------------+","title":"NVIDIA GPU Utilization"},{"location":"admin/joystick/","text":"Logitec F710 Game Controller for DonkeyCar https://docs.donkeycar.com/parts/controllers/ Testing to see if the Nano Recognizes the F710 USB Dongle You can use the \"lsusb\" UNIX shell command to list all the USB devices: $ lsusb Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter Bus 001 Device 005: ID 046d:c21f Logitech, Inc. F710 Wireless Gamepad [XInput Mode] Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Note that the USB device with an ID of 046d:c21f has been found in the 4th line above. The first ID before the colon is the device manufacturer (Logiteh) and the second is the id of their device (c21f). Linux looks this number up in their system and then loads the driver for this type of device. The driver will create a device file in the /dev/input directory called js0 $ ls -l /dev/input/js0 crw-rw-r--+ 1 root input 13, 0 Aug 16 19:30 /dev/input/js0 The \"c\" in the first letter says that this is a character I/O device. $ sudo apt-get install evtest [sudo] password for dan: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: apt-clone archdetect-deb bogl-bterm busybox-static cryptsetup-bin dpkg-repack gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common kde-window-manager kinit kio kpackagetool5 kwayland-data kwin-common kwin-data kwin-x11 libdebian-installer4 libkdecorations2-5v5 libkdecorations2private5v5 libkf5activities5 libkf5attica5 libkf5completion-data libkf5completion5 libkf5declarative-data libkf5declarative5 libkf5doctools5 libkf5globalaccel-data libkf5globalaccel5 libkf5globalaccelprivate5 libkf5idletime5 libkf5jobwidgets-data libkf5jobwidgets5 libkf5kcmutils-data libkf5kcmutils5 libkf5kiocore5 libkf5kiontlm5 libkf5kiowidgets5 libkf5newstuff-data libkf5newstuff5 libkf5newstuffcore5 libkf5package-data libkf5package5 libkf5plasma5 libkf5quickaddons5 libkf5solid5 libkf5solid5-data libkf5sonnet5-data libkf5sonnetcore5 libkf5sonnetui5 libkf5textwidgets-data libkf5textwidgets5 libkf5waylandclient5 libkf5waylandserver5 libkf5xmlgui-bin libkf5xmlgui-data libkf5xmlgui5 libkscreenlocker5 libkwin4-effect-builtins1 libkwineffects11 libkwinglutils11 libkwinxrenderutils11 libqgsttools-p1 libqt5designer5 libqt5help5 libqt5multimedia5 libqt5multimedia5-plugins libqt5multimediaquick-p5 libqt5multimediawidgets5 libqt5opengl5 libqt5positioning5 libqt5printsupport5 libqt5qml5 libqt5quick5 libqt5quickwidgets5 libqt5sensors5 libqt5sql5 libqt5test5 libqt5webchannel5 libqt5webkit5 libxcb-composite0 libxcb-cursor0 libxcb-damage0 os-prober python3-dbus.mainloop.pyqt5 python3-icu python3-pam python3-pyqt5 python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-sip qml-module-org-kde-kquickcontrolsaddons qml-module-qtmultimedia qml-module-qtquick2 rdate tasksel tasksel-data Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: evemu-tools libevemu3 The following NEW packages will be installed: evemu-tools evtest libevemu3 0 upgraded, 3 newly installed, 0 to remove and 7 not upgraded. Need to get 38.2 kB of archives. After this operation, 191 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libevemu3 arm64 2.6.0-0.1 [11.0 kB] Get:2 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 evemu-tools arm64 2.6.0-0.1 [12.3 kB] Get:3 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 evtest arm64 1:1.33-1build1 [14.9 kB] Fetched 38.2 kB in 1s (56.1 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libevemu3:arm64. (Reading database ... 140149 files and directories currently installed.) Preparing to unpack .../libevemu3_2.6.0-0.1_arm64.deb ... Unpacking libevemu3:arm64 (2.6.0-0.1) ... Selecting previously unselected package evemu-tools. Preparing to unpack .../evemu-tools_2.6.0-0.1_arm64.deb ... Unpacking evemu-tools (2.6.0-0.1) ... Selecting previously unselected package evtest. Preparing to unpack .../evtest_1%3a1.33-1build1_arm64.deb ... Unpacking evtest (1:1.33-1build1) ... Setting up evtest (1:1.33-1build1) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Setting up libevemu3:arm64 (2.6.0-0.1) ... Setting up evemu-tools (2.6.0-0.1) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... dan@danm-nano:~$ Now run it: $ evtest No device specified, trying to scan all of /dev/input/event* Not running as root, no devices may be available. Available devices: /dev/input/event2: Logitech Gamepad F710 Select the device event number [0-2]: 2 Logitech Gamepad F710 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x46d product 0xc21f version 0x305 Input device name: \"Logitech Gamepad F710\" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 304 (BTN_SOUTH) Event code 305 (BTN_EAST) Event code 307 (BTN_NORTH) Event code 308 (BTN_WEST) Event code 310 (BTN_TL) Event code 311 (BTN_TR) Event code 314 (BTN_SELECT) Event code 315 (BTN_START) Event code 316 (BTN_MODE) Event code 317 (BTN_THUMBL) Event code 318 (BTN_THUMBR) Event type 3 (EV_ABS) Event code 0 (ABS_X) Value 128 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 1 (ABS_Y) Value -129 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 2 (ABS_Z) Value 0 Min 0 Max 255 Event code 3 (ABS_RX) Value 128 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 4 (ABS_RY) Value -129 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 5 (ABS_RZ) Value 0 Min 0 Max 255 Event code 16 (ABS_HAT0X) Value 0 Min -1 Max 1 Event code 17 (ABS_HAT0Y) Value 0 Min -1 Max 1 Properties: Testing ... (interrupt to exit) Now as you press any key or move any joystick you will see the events. When I press the yellow Y we see: Event: time 1566006064.962158, type 1 (EV_KEY), code 308 (BTN_WEST), value 1 Event: time 1566006064.962158, -------------- SYN_REPORT ------------ Event: time 1566006065.129981, type 1 (EV_KEY), code 308 (BTN_WEST), value 0 Event: time 1566006065.129981, -------------- SYN_REPORT ------------ Blue X Event: time 1566006110.047015, type 1 (EV_KEY), code 307 (BTN_NORTH), value 1 Event: time 1566006110.047015, -------------- SYN_REPORT ------------ Event: time 1566006110.182606, type 1 (EV_KEY), code 307 (BTN_NORTH), value 0 Event: time 1566006110.182606, -------------- SYN_REPORT ------------ Red B Event: time 1566006143.423217, type 1 (EV_KEY), code 305 (BTN_EAST), value 1 Event: time 1566006143.423217, -------------- SYN_REPORT ------------ Event: time 1566006143.499642, type 1 (EV_KEY), code 305 (BTN_EAST), value 0 Event: time 1566006143.499642, -------------- SYN_REPORT ------------ Green A Event: time 1566006184.060282, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 1 Event: time 1566006184.060282, -------------- SYN_REPORT ------------ Event: time 1566006184.128408, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 0 Event: time 1566006184.128408, -------------- SYN_REPORT ------------ Moving the joystick generates: Event: time 1566006255.549652, -------------- SYN_REPORT ------------ Event: time 1566006255.553650, type 3 (EV_ABS), code 1 (ABS_Y), value -10923 Event: time 1566006255.553650, -------------- SYN_REPORT ------------ Event: time 1566006255.557650, type 3 (EV_ABS), code 1 (ABS_Y), value -14264 Event: time 1566006255.557650, -------------- SYN_REPORT ------------ Event: time 1566006255.561652, type 3 (EV_ABS), code 1 (ABS_Y), value -18633","title":"Joystick"},{"location":"admin/nvidia-driver-install/","text":"Install the NVIDIA Driver Ideally you should be able to use the Ubuntu \"Software and Updates\" tool to install the NIVIDA driver. This usually works, but if you get errors, you may need to use the unix shell. NVIDIA Card Verification You can first verify that the GPU card has been installed and powered up. We can use the \"list hardware\" command with the display option: 1 $ sudo lshw -C display 1 2 3 4 5 6 7 8 9 10 11 12 *- display UNCLAIMED description : VGA compatible controller product : GV102 vendor : NVIDIA Corporation physical id : 0 bus info : pci @0000 : 09 : 00.0 version : a1 width : 64 bits clock : 33 MHz capabilities : pm msi pciexpress vga_controller bus_master cap_list configuration : latency = 0 resources : memory : f6000000 - f6ffffff memory : e0000000 - efffffff memory : f0000000 - f1ffffff ioport : e000 ( size = 128 ) memory : c0000 - dffff This shows that there is a GPU card installed but not claimed by the display. NVIDIA Devices You can then use the ubuntu-drivers command to see the devices. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0 == modalias : pci:v000010DEd00001E07sv000010DEsd000012A4bc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-470 - distro non-free recommended driver : nvidia-driver-460-server - distro non-free driver : nvidia-driver-418-server - distro non-free driver : nvidia-driver-460 - distro non-free driver : nvidia-driver-450-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin == /sys/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:04.0/0000:05:00.0 == modalias : pci:v00008086d00002723sv00008086sd00000084bc02sc80i00 vendor : Intel Corporation manual_install: True driver : backport-iwlwifi-dkms - distro free Ubuntu Drivers Autoinstall 1 sudo ubuntu-drivers autoinstall This tool will tell you what drivers you need to install. 1 sudo apt-get install nvidia-driver-470 This will often generate errors but it will indicate what other libraries need to be installed for the 470 driver to work. Final Test Now we are ready to probe the full GPU and get all the statistics of what is in the GPU. 1 nvidia-smi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Thu Jul 22 22:59:36 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 Off | N/A | | 41% 36C P8 2W / 260W | 283MiB / 11016MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 98MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 91MiB | +-----------------------------------------------------------------------------+ If you don't get this or a similar display, you must continue to search for installation instructions. After you get this screen you can reboot. CUDA Version 1 nvcc --version Results: 1 2 3 4 nvcc : NVIDIA ( R ) Cuda compiler driver Copyright ( c ) 2005 - 2017 NVIDIA Corporation Built on Fri_Nov__3_21 : 07 : 56 _CDT_2017 Cuda compilation tools , release 9.1 , V9 . 1.85 CUDA Tookkit Install for PyTorch 1 conda install cudatoolkit = -c pytorch 1 conda install cudatoolkit = 11 -c pytorch","title":"NVIDIA Driver Installation"},{"location":"admin/nvidia-driver-install/#install-the-nvidia-driver","text":"Ideally you should be able to use the Ubuntu \"Software and Updates\" tool to install the NIVIDA driver. This usually works, but if you get errors, you may need to use the unix shell.","title":"Install the NVIDIA Driver"},{"location":"admin/nvidia-driver-install/#nvidia-card-verification","text":"You can first verify that the GPU card has been installed and powered up. We can use the \"list hardware\" command with the display option: 1 $ sudo lshw -C display 1 2 3 4 5 6 7 8 9 10 11 12 *- display UNCLAIMED description : VGA compatible controller product : GV102 vendor : NVIDIA Corporation physical id : 0 bus info : pci @0000 : 09 : 00.0 version : a1 width : 64 bits clock : 33 MHz capabilities : pm msi pciexpress vga_controller bus_master cap_list configuration : latency = 0 resources : memory : f6000000 - f6ffffff memory : e0000000 - efffffff memory : f0000000 - f1ffffff ioport : e000 ( size = 128 ) memory : c0000 - dffff This shows that there is a GPU card installed but not claimed by the display.","title":"NVIDIA Card Verification"},{"location":"admin/nvidia-driver-install/#nvidia-devices","text":"You can then use the ubuntu-drivers command to see the devices. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0 == modalias : pci:v000010DEd00001E07sv000010DEsd000012A4bc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-470 - distro non-free recommended driver : nvidia-driver-460-server - distro non-free driver : nvidia-driver-418-server - distro non-free driver : nvidia-driver-460 - distro non-free driver : nvidia-driver-450-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin == /sys/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:04.0/0000:05:00.0 == modalias : pci:v00008086d00002723sv00008086sd00000084bc02sc80i00 vendor : Intel Corporation manual_install: True driver : backport-iwlwifi-dkms - distro free","title":"NVIDIA Devices"},{"location":"admin/nvidia-driver-install/#ubuntu-drivers-autoinstall","text":"1 sudo ubuntu-drivers autoinstall This tool will tell you what drivers you need to install. 1 sudo apt-get install nvidia-driver-470 This will often generate errors but it will indicate what other libraries need to be installed for the 470 driver to work.","title":"Ubuntu Drivers Autoinstall"},{"location":"admin/nvidia-driver-install/#final-test","text":"Now we are ready to probe the full GPU and get all the statistics of what is in the GPU. 1 nvidia-smi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Thu Jul 22 22:59:36 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 Off | N/A | | 41% 36C P8 2W / 260W | 283MiB / 11016MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 98MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 91MiB | +-----------------------------------------------------------------------------+ If you don't get this or a similar display, you must continue to search for installation instructions. After you get this screen you can reboot.","title":"Final Test"},{"location":"admin/nvidia-driver-install/#cuda-version","text":"1 nvcc --version Results: 1 2 3 4 nvcc : NVIDIA ( R ) Cuda compiler driver Copyright ( c ) 2005 - 2017 NVIDIA Corporation Built on Fri_Nov__3_21 : 07 : 56 _CDT_2017 Cuda compilation tools , release 9.1 , V9 . 1.85","title":"CUDA Version"},{"location":"admin/nvidia-driver-install/#cuda-tookkit-install-for-pytorch","text":"1 conda install cudatoolkit = -c pytorch 1 conda install cudatoolkit = 11 -c pytorch","title":"CUDA Tookkit Install for PyTorch"},{"location":"admin/tensorflow-gpu-install/","text":"$ conda install tensorflow-gpu==2.2.0 Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with flexible solve. Collecting package metadata (repodata.json): done Solving environment: done Package Plan environment location: /home/arl/miniconda3/envs/donkey added / updated specs: - tensorflow-gpu==2.2.0 The following packages will be downloaded: 1 2 3 4 5 6 7 8 9 10 package | build ---------------------------|----------------- cudatoolkit-10.1.243 | h6bb024c_0 347.4 MB cudnn-7.6.5 | cuda10.1_0 179.9 MB cupti-10.1.168 | 0 1.4 MB tensorflow-2.2.0 |gpu_py37h1a511ff_0 4 KB tensorflow-base-2.2.0 |gpu_py37h8a81be8_0 181.7 MB tensorflow-gpu-2.2.0 | h0d30ee6_0 3 KB ------------------------------------------------------------ Total: 710.4 MB The following NEW packages will be INSTALLED: cudatoolkit pkgs/main/linux-64::cudatoolkit-10.1.243-h6bb024c_0 cudnn pkgs/main/linux-64::cudnn-7.6.5-cuda10.1_0 cupti pkgs/main/linux-64::cupti-10.1.168-0 tensorflow-gpu pkgs/main/linux-64::tensorflow-gpu-2.2.0-h0d30ee6_0 The following packages will be DOWNGRADED: _tflow_select 2.3.0-mkl --> 2.1.0-gpu tensorflow 2.2.0-mkl_py37h6e9ce2d_0 --> 2.2.0-gpu_py37h1a511ff_0 tensorflow-base 2.2.0-mkl_py37hd506778_0 --> 2.2.0-gpu_py37h8a81be8_0 Proceed ([y]/n)? Y Downloading and Extracting Packages tensorflow-base-2.2. | 181.7 MB | ################################################################################################################################################################ | 100% cudnn-7.6.5 | 179.9 MB | ################################################################################################################################################################ | 100% cupti-10.1.168 | 1.4 MB | ################################################################################################################################################################ | 100% tensorflow-2.2.0 | 4 KB | ################################################################################################################################################################ | 100% tensorflow-gpu-2.2.0 | 3 KB | ################################################################################################################################################################ | 100% cudatoolkit-10.1.243 | 347.4 MB | ################################################################################################################################################################ | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done","title":"Tensorflow GPU Software"},{"location":"admin/tensorflow-gpu-install/#package-plan","text":"environment location: /home/arl/miniconda3/envs/donkey added / updated specs: - tensorflow-gpu==2.2.0 The following packages will be downloaded: 1 2 3 4 5 6 7 8 9 10 package | build ---------------------------|----------------- cudatoolkit-10.1.243 | h6bb024c_0 347.4 MB cudnn-7.6.5 | cuda10.1_0 179.9 MB cupti-10.1.168 | 0 1.4 MB tensorflow-2.2.0 |gpu_py37h1a511ff_0 4 KB tensorflow-base-2.2.0 |gpu_py37h8a81be8_0 181.7 MB tensorflow-gpu-2.2.0 | h0d30ee6_0 3 KB ------------------------------------------------------------ Total: 710.4 MB The following NEW packages will be INSTALLED: cudatoolkit pkgs/main/linux-64::cudatoolkit-10.1.243-h6bb024c_0 cudnn pkgs/main/linux-64::cudnn-7.6.5-cuda10.1_0 cupti pkgs/main/linux-64::cupti-10.1.168-0 tensorflow-gpu pkgs/main/linux-64::tensorflow-gpu-2.2.0-h0d30ee6_0 The following packages will be DOWNGRADED: _tflow_select 2.3.0-mkl --> 2.1.0-gpu tensorflow 2.2.0-mkl_py37h6e9ce2d_0 --> 2.2.0-gpu_py37h1a511ff_0 tensorflow-base 2.2.0-mkl_py37hd506778_0 --> 2.2.0-gpu_py37h8a81be8_0 Proceed ([y]/n)? Y Downloading and Extracting Packages tensorflow-base-2.2. | 181.7 MB | ################################################################################################################################################################ | 100% cudnn-7.6.5 | 179.9 MB | ################################################################################################################################################################ | 100% cupti-10.1.168 | 1.4 MB | ################################################################################################################################################################ | 100% tensorflow-2.2.0 | 4 KB | ################################################################################################################################################################ | 100% tensorflow-gpu-2.2.0 | 3 KB | ################################################################################################################################################################ | 100% cudatoolkit-10.1.243 | 347.4 MB | ################################################################################################################################################################ | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done","title":"Package Plan"},{"location":"lesson-plans/car-structure/","text":"RC Car Structure Using GPTChat To Help Generate Block Diagrams Generating architecture diagrams can be a slow and painful process. But ChatGPT can help. here is a process of generating a block diagram using ChatGPT. We can use the Mermaid Live program to view the diagram. ChatGPT also has a diagram plugin that will render the image within ChatGPT. GPTChat Prompt ```linenums=\"0\" Create a mermaid block diagram for the structure of a Donkey Car. Make sure to label all the components and their connection types. Return the results in raw mermaid format. Include the following structures: The main computer (Raspberry Pi or NVIDIA Nano) The main computer has an I2C connection to the Servo Controller board The Servo Controller connects to the Steering Servo and the Electronic Speed Controller (ESC) via PWM connections The ESC connects to the RC Car Battery THE ESC connects to the Car Motor The 5v battery powers the main computer There are two batteries: a 5V battery and a 7V RC Car Battery. The Servo controller is a PCA9685 board. 1 ## ChatGPT Response This code will create a block diagram where: The \"Main Computer\" (A) connects to the \"Servo Controller\" (B) via an I2C connection. The \"Servo Controller\" (B) connects to both the \"Steering Servo\" (C) and \"Electronic Speed Controller\" (D) via PWM connections. The \"Electronic Speed Controller\" (D) connects to both the \"RC Car Battery\" (E) and the \"Car Motor\" (F). The \"5V Battery\" (G) connects to the \"Main Computer\" (A) as well as to the \"Positive Connection\" (H) and \"Negative Connection\" (I). The \"RC Car Battery\" (E) also connects to both the \"Positive Connection\" (H) and \"Negative Connection\" (I). Please note that this is a simplified diagram and does not necessarily represent the physical arrangement of the components in an actual Donkey Car setup. This diagram should be taken as an abstract representation of how the components interact. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ## Mermaid Diagram ``` mermaid graph TB A [ \"Main Computer
Raspberry Pi or NVIDIA Nano\" ] B [ \"Servo Controller
PCA9685 board\" ] C [ \"Steering Servo\" ] D [ \"Electronic Speed Controller
(ESC)\" ] E [ \"RC Car Battery (7V)\" ] F [ \"Car Motor\" ] G [ \"5V Battery\" ] A -- I2C --> B B -- PWM --> C B -- PWM --> D D --- E D --- F G --- A","title":"Generating Block Diagrams"},{"location":"lesson-plans/car-structure/#rc-car-structure","text":"","title":"RC Car Structure"},{"location":"lesson-plans/car-structure/#using-gptchat-to-help-generate-block-diagrams","text":"Generating architecture diagrams can be a slow and painful process. But ChatGPT can help. here is a process of generating a block diagram using ChatGPT. We can use the Mermaid Live program to view the diagram. ChatGPT also has a diagram plugin that will render the image within ChatGPT.","title":"Using GPTChat To Help Generate Block Diagrams"},{"location":"lesson-plans/car-structure/#gptchat-prompt","text":"```linenums=\"0\" Create a mermaid block diagram for the structure of a Donkey Car. Make sure to label all the components and their connection types. Return the results in raw mermaid format. Include the following structures: The main computer (Raspberry Pi or NVIDIA Nano) The main computer has an I2C connection to the Servo Controller board The Servo Controller connects to the Steering Servo and the Electronic Speed Controller (ESC) via PWM connections The ESC connects to the RC Car Battery THE ESC connects to the Car Motor The 5v battery powers the main computer There are two batteries: a 5V battery and a 7V RC Car Battery. The Servo controller is a PCA9685 board. 1 ## ChatGPT Response This code will create a block diagram where: The \"Main Computer\" (A) connects to the \"Servo Controller\" (B) via an I2C connection. The \"Servo Controller\" (B) connects to both the \"Steering Servo\" (C) and \"Electronic Speed Controller\" (D) via PWM connections. The \"Electronic Speed Controller\" (D) connects to both the \"RC Car Battery\" (E) and the \"Car Motor\" (F). The \"5V Battery\" (G) connects to the \"Main Computer\" (A) as well as to the \"Positive Connection\" (H) and \"Negative Connection\" (I). The \"RC Car Battery\" (E) also connects to both the \"Positive Connection\" (H) and \"Negative Connection\" (I). Please note that this is a simplified diagram and does not necessarily represent the physical arrangement of the components in an actual Donkey Car setup. This diagram should be taken as an abstract representation of how the components interact. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ## Mermaid Diagram ``` mermaid graph TB A [ \"Main Computer
Raspberry Pi or NVIDIA Nano\" ] B [ \"Servo Controller
PCA9685 board\" ] C [ \"Steering Servo\" ] D [ \"Electronic Speed Controller
(ESC)\" ] E [ \"RC Car Battery (7V)\" ] F [ \"Car Motor\" ] G [ \"5V Battery\" ] A -- I2C --> B B -- PWM --> C B -- PWM --> D D --- E D --- F G --- A","title":"GPTChat Prompt"},{"location":"lesson-plans/computer-vision/","text":"AI Racing League Computer Vision Table Raspberry Pi and the NVIDIA Nano are popular systems for demonstrating various computer vision applications due to their affordability and flexibility. Requirements For these lessons, you just need a Raspberry Pi (or Nano) and the attached Camera that we use for all our cars. Sample Labs Here are several demos we show to high school students using OpenCV and Raspberry Pi: Face Detection and Recognition We can use the built-in Haar cascades in OpenCV for face and eyes detection. For the face recognition part, you can use either OpenCV's built-in algorithms or deep learning-based models such as FaceNet. Object Detection Use pre-trained models from OpenCV's DNN module or TensorFlow's model zoo to recognize multiple objects in real-time. Optical Character Recognition (OCR): Combine OpenCV for image processing and Tesseract for character recognition to demonstrate how a device can read text from images or real-time video feed. Color Detection Write a simple program that detects specific colors in real-time. This can be used as a stepping stone to more advanced object tracking projects. We can also combine this lab with our Raspberry Pi Pico color detection sensors. Motion Detection and Tracking Implement a simple surveillance system that detects motion and tracks moving objects. This can be a good introduction to video analysis. Augmented Reality Show how to overlay graphics on a real-time video feed based on detected features. For example, you can use OpenCV's capabilities for feature detection (like SIFT, SURF, ORB) and perspective transformation to overlay 3D objects on a marker. Hand Gesture Recognition Create a program that recognizes hand gestures and associates them with commands. You could use this to control a game or navigate a user interface. License Plate Recognition You can implement a simple Automatic Number Plate Recognition (ANPR) system using image processing techniques in OpenCV and OCR. QR Code and Barcode Scanner Use OpenCV for real-time detection and decoding of QR codes and barcodes. Most of these demonstrations will require additional Python libraries beyond just OpenCV, like NumPy, Pillow, or TensorFlow. For hardware, you will need the Raspberry Pi 3 with 4GB RAM, a camera module, and potentially additional items like a monitor, mouse, and keyboard for a fully interactive setup.","title":"Computer Vision Labs"},{"location":"lesson-plans/computer-vision/#ai-racing-league-computer-vision-table","text":"Raspberry Pi and the NVIDIA Nano are popular systems for demonstrating various computer vision applications due to their affordability and flexibility.","title":"AI Racing League Computer Vision Table"},{"location":"lesson-plans/computer-vision/#requirements","text":"For these lessons, you just need a Raspberry Pi (or Nano) and the attached Camera that we use for all our cars.","title":"Requirements"},{"location":"lesson-plans/computer-vision/#sample-labs","text":"Here are several demos we show to high school students using OpenCV and Raspberry Pi:","title":"Sample Labs"},{"location":"lesson-plans/computer-vision/#face-detection-and-recognition","text":"We can use the built-in Haar cascades in OpenCV for face and eyes detection. For the face recognition part, you can use either OpenCV's built-in algorithms or deep learning-based models such as FaceNet.","title":"Face Detection and Recognition"},{"location":"lesson-plans/computer-vision/#object-detection","text":"Use pre-trained models from OpenCV's DNN module or TensorFlow's model zoo to recognize multiple objects in real-time.","title":"Object Detection"},{"location":"lesson-plans/computer-vision/#optical-character-recognition-ocr","text":"Combine OpenCV for image processing and Tesseract for character recognition to demonstrate how a device can read text from images or real-time video feed.","title":"Optical Character Recognition (OCR):"},{"location":"lesson-plans/computer-vision/#color-detection","text":"Write a simple program that detects specific colors in real-time. This can be used as a stepping stone to more advanced object tracking projects. We can also combine this lab with our Raspberry Pi Pico color detection sensors.","title":"Color Detection"},{"location":"lesson-plans/computer-vision/#motion-detection-and-tracking","text":"Implement a simple surveillance system that detects motion and tracks moving objects. This can be a good introduction to video analysis.","title":"Motion Detection and Tracking"},{"location":"lesson-plans/computer-vision/#augmented-reality","text":"Show how to overlay graphics on a real-time video feed based on detected features. For example, you can use OpenCV's capabilities for feature detection (like SIFT, SURF, ORB) and perspective transformation to overlay 3D objects on a marker.","title":"Augmented Reality"},{"location":"lesson-plans/computer-vision/#hand-gesture-recognition","text":"Create a program that recognizes hand gestures and associates them with commands. You could use this to control a game or navigate a user interface.","title":"Hand Gesture Recognition"},{"location":"lesson-plans/computer-vision/#license-plate-recognition","text":"You can implement a simple Automatic Number Plate Recognition (ANPR) system using image processing techniques in OpenCV and OCR.","title":"License Plate Recognition"},{"location":"lesson-plans/computer-vision/#qr-code-and-barcode-scanner","text":"Use OpenCV for real-time detection and decoding of QR codes and barcodes. Most of these demonstrations will require additional Python libraries beyond just OpenCV, like NumPy, Pillow, or TensorFlow. For hardware, you will need the Raspberry Pi 3 with 4GB RAM, a camera module, and potentially additional items like a monitor, mouse, and keyboard for a fully interactive setup.","title":"QR Code and Barcode Scanner"},{"location":"lesson-plans/data-analysis/","text":"Data Analysis In these lessons, we learn how to write some basic data analysis Python programs. In the real world, you are often given some data and people ask us \"Tell me what insights you can give me about this data.\" This forms the basis of a field of data science called \"EDA\" for \"Electronic Data Analysis\". For example, say you are on a project to get cars to drive using machine learning. What insights can you derive from the sample images and driving data? Numpy Profiler TBD","title":"Introduction"},{"location":"lesson-plans/data-analysis/#data-analysis","text":"In these lessons, we learn how to write some basic data analysis Python programs. In the real world, you are often given some data and people ask us \"Tell me what insights you can give me about this data.\" This forms the basis of a field of data science called \"EDA\" for \"Electronic Data Analysis\". For example, say you are on a project to get cars to drive using machine learning. What insights can you derive from the sample images and driving data?","title":"Data Analysis"},{"location":"lesson-plans/data-analysis/#numpy-profiler","text":"TBD","title":"Numpy Profiler"},{"location":"lesson-plans/data-analysis/01-intro/","text":"AI Racing League Data Analysis Why Analysis? Data analysis is a core part of building accurate models that create high quality predictions. Here are some sample analytics tasks: Understand what data we have Browse data sets Run metrics that count the number of items in a dataset Open sample items and view sample images Look for groupings of data Look at averages of values Remove poor training data Tools: Python and Jupyter Notebooks Libraries: os, image, numpy, dataframes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Intro Part 2"},{"location":"lesson-plans/data-analysis/01-intro/#ai-racing-league-data-analysis","text":"","title":"AI Racing League Data Analysis"},{"location":"lesson-plans/data-analysis/01-intro/#why-analysis","text":"Data analysis is a core part of building accurate models that create high quality predictions. Here are some sample analytics tasks: Understand what data we have Browse data sets Run metrics that count the number of items in a dataset Open sample items and view sample images Look for groupings of data Look at averages of values Remove poor training data","title":"Why Analysis?"},{"location":"lesson-plans/data-analysis/01-intro/#tools-python-and-jupyter-notebooks","text":"","title":"Tools: Python and Jupyter Notebooks"},{"location":"lesson-plans/data-analysis/01-intro/#libraries-os-image-numpy-dataframes","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Libraries: os, image, numpy, dataframes"},{"location":"lesson-plans/data-analysis/02-listing-files/","text":"Working with Files Listing Files with the OS library Python provides a powerful library for working with Operating System resources like file systems. We will start out with the listdir() function that lists the files in a directory. Here is program that lists all the tub files in our mycar/data directory: 1 2 3 4 5 6 import os data_dir = \"/home/arl/mycar/data/\" files = os . listdir ( data_dir ) for file in files : print ( file ) returns: 1 2 3 4 5 a-test-tub my-test-tub junk-tub production-run tub-47 Listing Files in a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 ) List Random Files In Images Directory 1 2 3 4 5 6 7 8 9 10 import os import matplotlib.pyplot as plt from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" image_file_name_list = os . listdir ( image_dir ) for index in range ( 0 , 10 ): file_name = image_file_name_list [ index ] print ( file_name ) returns: 1 2 3 4 5 6 7 8 9 10 10263 _cam_image_array_ . jpg 6257 _cam_image_array_ . jpg 15248 _cam_image_array_ . jpg 3916 _cam_image_array_ . jpg 5223 _cam_image_array_ . jpg 15765 _cam_image_array_ . jpg 8437 _cam_image_array_ . jpg 5871 _cam_image_array_ . jpg 16681 _cam_image_array_ . jpg 15281 _cam_image_array_ . jpg Note that the files are not in any specific order. Show Images for 10 Random Files 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import glob import matplotlib.pyplot as plt import matplotlib.image as mpimg % matplotlib inline images = [] for img_path in glob . glob ( '/home/arl/mycar/data/dans-msp/data/images/*.jpg' ): images . append ( mpimg . imread ( img_path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image ) Sorting Images By File Name We can add an additional step if we want to sort the images by the file name: 1 2 image_file_name_list = os . listdir ( image_dir ) image_file_name_list . sort () Return Images Based On Creation Date 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import os import matplotlib.pyplot as plt from IPython.display import Image from pathlib import Path image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" paths = sorted ( Path ( image_dir ) . iterdir (), key = os . path . getmtime ) images = [] # just get the first 10 items in the list of images for path in paths [: 10 ]: print ( path ) images . append ( mpimg . imread ( path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Listing Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#working-with-files","text":"","title":"Working with Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#listing-files-with-the-os-library","text":"Python provides a powerful library for working with Operating System resources like file systems. We will start out with the listdir() function that lists the files in a directory. Here is program that lists all the tub files in our mycar/data directory: 1 2 3 4 5 6 import os data_dir = \"/home/arl/mycar/data/\" files = os . listdir ( data_dir ) for file in files : print ( file ) returns: 1 2 3 4 5 a-test-tub my-test-tub junk-tub production-run tub-47","title":"Listing Files with the OS library"},{"location":"lesson-plans/data-analysis/02-listing-files/#listing-files-in-a","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Listing Files in a"},{"location":"lesson-plans/data-analysis/02-listing-files/#list-random-files-in-images-directory","text":"1 2 3 4 5 6 7 8 9 10 import os import matplotlib.pyplot as plt from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" image_file_name_list = os . listdir ( image_dir ) for index in range ( 0 , 10 ): file_name = image_file_name_list [ index ] print ( file_name ) returns: 1 2 3 4 5 6 7 8 9 10 10263 _cam_image_array_ . jpg 6257 _cam_image_array_ . jpg 15248 _cam_image_array_ . jpg 3916 _cam_image_array_ . jpg 5223 _cam_image_array_ . jpg 15765 _cam_image_array_ . jpg 8437 _cam_image_array_ . jpg 5871 _cam_image_array_ . jpg 16681 _cam_image_array_ . jpg 15281 _cam_image_array_ . jpg Note that the files are not in any specific order.","title":"List Random Files In Images Directory"},{"location":"lesson-plans/data-analysis/02-listing-files/#show-images-for-10-random-files","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 import glob import matplotlib.pyplot as plt import matplotlib.image as mpimg % matplotlib inline images = [] for img_path in glob . glob ( '/home/arl/mycar/data/dans-msp/data/images/*.jpg' ): images . append ( mpimg . imread ( img_path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Show Images for 10 Random Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#sorting-images-by-file-name","text":"We can add an additional step if we want to sort the images by the file name: 1 2 image_file_name_list = os . listdir ( image_dir ) image_file_name_list . sort ()","title":"Sorting Images By File Name"},{"location":"lesson-plans/data-analysis/02-listing-files/#return-images-based-on-creation-date","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import os import matplotlib.pyplot as plt from IPython.display import Image from pathlib import Path image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" paths = sorted ( Path ( image_dir ) . iterdir (), key = os . path . getmtime ) images = [] # just get the first 10 items in the list of images for path in paths [: 10 ]: print ( path ) images . append ( mpimg . imread ( path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Return Images Based On Creation Date"},{"location":"lesson-plans/data-analysis/03-viewing-images/","text":"Viewing Images Viewing a Single JPG Image","title":"Viewing Images"},{"location":"lesson-plans/data-analysis/03-viewing-images/#viewing-images","text":"","title":"Viewing Images"},{"location":"lesson-plans/data-analysis/03-viewing-images/#viewing-a-single-jpg-image","text":"","title":"Viewing a Single JPG Image"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/","text":"Viewing Catalog Files The data about each image, sometimes called the image \"metadata\", is stored in a file that ends with the file extension .catalog. If you open these files, you will see a simple layout that looks like the following: 1 2 3 {'_index': 16000, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545360, 'cam/image_array': '16000_cam_image_array_.jpg', 'user/angle': 1.0, 'user/mode': 'user', 'user/throttle': 0.5} {'_index': 16001, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545411, 'cam/image_array': '16001_cam_image_array_.jpg', 'user/angle': 0.37, 'user/mode': 'user', 'user/throttle': 0.7} {'_index': 16002, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545460, 'cam/image_array': '16002_cam_image_array_.jpg', 'user/angle': -0.23, 'user/mode': 'user', 'user/throttle': 0.25} This file consists of multiple lines, each line starts and ends with curly braces \"{\" and \"}\". Within these curly braces are a set of key-value pairs where the label is a string in single quotes followed by a colon, the value and a comma. This file uses newlines to separate records and a JSON object format within each single line. Note this is NOT a full JSON file format so you can't just use a standard JSON library to read the catalog file. Here is that format with a the key and value on separate lines to make the line easier to read. 1 2 3 4 5 6 7 8 9 10 { '_i n dex' : 16000 , '_sessio n _id' : ' 21-07-20 _ 0 ' , '_ t imes ta mp_ms' : 1626797545360 , 'cam/image_array' : ' 16000 _cam_image_array_.jpg' , 'user/a n gle' : 1.0 , 'user/mode' : 'user' , 'user/ t hro ttle ' : 0.5 } This format is very similar to a JSON file with the following exceptions: There is no root element to tell us when the JSON file starts and ends There are no commas between the item Here is what a properly formatted JSON file would look like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { \"driveData\" : [ { \"_index\" : 16000 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545360 , \"cam/image_array\" : \"16000_cam_image_array_.jpg\" , \"user/angle\" : 1.0 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.5 }, { \"_index\" : 16001 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545411 , \"cam/image_array\" : \"16001_cam_image_array_.jpg\" , \"user/angle\" : 0.37 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.70 }, { \"_index\" : 16002 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545460 , \"cam/image_array\" : \"16002_cam_image_array_.jpg\" , \"user/angle\" : -0.23 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.25 } ] } Here is a sample JSON file reader that would read this file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.json is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_json_file = script_dir + '/test.json' # Open the JSON test file for read only f = open ( path_to_json_file , 'r' ) # returns JSON object as a dictionary data = json . load ( f ) # Iterating through the json file for the items in the drive data dictionary for i in data [ 'driveData' ]: print ( i ) # Close the JSON file f . close () Note that the open() function reads the file with the \"r\" option which indicates read-only mode. Although this format would make reading the file simple, there are some disadvantages. The key is that individual lines in the new catalog format are atomic units of storage and the files can be easily split and joined using line-by-line tools. Reading Catalog Lines to JSON Objects To read in the values of the catalog file we will open using a line-oriented data structure assuming that there is a newline at the end of each record. We can then just the json library's loads() function which will convert each line to a JSON object. Sample Objects.json file: 1 2 3 4 {\"name\":\"Ann\",\"age\":15} {\"name\":\"Peggy\",\"age\":16} {\"name\":\"Rima\",\"age\":13} {\"name\":\"Sue\",\"age\":14} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import os , json json_file = \"objects.json\" script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/' + json_file f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : line_in_json = json . loads ( line ) count += 1 print ( count , ' ' , end = '' ) print ( line_in_json ) # the result is a Python dictionary print ( line_in_json [ 'name' ]) print ( \"Name:\" , line_to_json [ \"name\" ] ) print ( \"Age:\" , line_to_json [ \"age\" ] ) Returns 1 2 3 4 5 6 7 8 9 10 11 12 1 {' name ' : ' Ann ' , ' age ' : 15 } Name : Ann Age : 15 2 {' name ' : ' Peggy ' , ' age ' : 16 } Name : Peggy Age : 16 3 {' name ' : ' Rima ' , ' age ' : 13 } Name : Rima Age : 13 4 {' name ' : ' Sue ' , ' age ' : 14 } Name : Sue Age : 14 Sample CataLog Reader Program 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 print ( ' \\n\\n line:' , count ) # print(j) print ( \"Index:\" , j [ \"_index\" ] ) print ( \"Session:\" , j [ \"_session_id\" ] ) print ( \"Timestamp:\" , j [ \"_timestamp_ms\" ] ) print ( \"cam/image_array:\" , j [ \"cam/image_array\" ] ) print ( \"user/angle:\" , j [ \"user/angle\" ] ) print ( \"user/mode:\" , j [ \"user/mode\" ] ) print ( \"user/throttle:\" , j [ \"user/throttle\" ] ) returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 line : 1 Index : 16000 Session : 21 - 07 - 20 _0 Timestamp : 1626797545360 cam / image_array : 16000 _cam_image_array_ . jpg user / angle : 1.0 user / mode : user user / throttle : 0.31 line : 2 Index : 16001 Session : 21 - 07 - 20 _0 Timestamp : 1626797545411 cam / image_array : 16001 _cam_image_array_ . jpg user / angle : 0.3715323343607898 user / mode : user user / throttle : 0.31 line : 3 Index : 16002 Session : 21 - 07 - 20 _0 Timestamp : 1626797545460 cam / image_array : 16002 _cam_image_array_ . jpg user / angle : 0.2371288186284982 user / mode : user user / throttle : 0.31 Reference The Python class that creates version 2 of the catalog files is here","title":"Viewing Catalog Files"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#viewing-catalog-files","text":"The data about each image, sometimes called the image \"metadata\", is stored in a file that ends with the file extension .catalog. If you open these files, you will see a simple layout that looks like the following: 1 2 3 {'_index': 16000, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545360, 'cam/image_array': '16000_cam_image_array_.jpg', 'user/angle': 1.0, 'user/mode': 'user', 'user/throttle': 0.5} {'_index': 16001, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545411, 'cam/image_array': '16001_cam_image_array_.jpg', 'user/angle': 0.37, 'user/mode': 'user', 'user/throttle': 0.7} {'_index': 16002, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545460, 'cam/image_array': '16002_cam_image_array_.jpg', 'user/angle': -0.23, 'user/mode': 'user', 'user/throttle': 0.25} This file consists of multiple lines, each line starts and ends with curly braces \"{\" and \"}\". Within these curly braces are a set of key-value pairs where the label is a string in single quotes followed by a colon, the value and a comma. This file uses newlines to separate records and a JSON object format within each single line. Note this is NOT a full JSON file format so you can't just use a standard JSON library to read the catalog file. Here is that format with a the key and value on separate lines to make the line easier to read. 1 2 3 4 5 6 7 8 9 10 { '_i n dex' : 16000 , '_sessio n _id' : ' 21-07-20 _ 0 ' , '_ t imes ta mp_ms' : 1626797545360 , 'cam/image_array' : ' 16000 _cam_image_array_.jpg' , 'user/a n gle' : 1.0 , 'user/mode' : 'user' , 'user/ t hro ttle ' : 0.5 } This format is very similar to a JSON file with the following exceptions: There is no root element to tell us when the JSON file starts and ends There are no commas between the item Here is what a properly formatted JSON file would look like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { \"driveData\" : [ { \"_index\" : 16000 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545360 , \"cam/image_array\" : \"16000_cam_image_array_.jpg\" , \"user/angle\" : 1.0 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.5 }, { \"_index\" : 16001 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545411 , \"cam/image_array\" : \"16001_cam_image_array_.jpg\" , \"user/angle\" : 0.37 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.70 }, { \"_index\" : 16002 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545460 , \"cam/image_array\" : \"16002_cam_image_array_.jpg\" , \"user/angle\" : -0.23 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.25 } ] } Here is a sample JSON file reader that would read this file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.json is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_json_file = script_dir + '/test.json' # Open the JSON test file for read only f = open ( path_to_json_file , 'r' ) # returns JSON object as a dictionary data = json . load ( f ) # Iterating through the json file for the items in the drive data dictionary for i in data [ 'driveData' ]: print ( i ) # Close the JSON file f . close () Note that the open() function reads the file with the \"r\" option which indicates read-only mode. Although this format would make reading the file simple, there are some disadvantages. The key is that individual lines in the new catalog format are atomic units of storage and the files can be easily split and joined using line-by-line tools.","title":"Viewing Catalog Files"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#reading-catalog-lines-to-json-objects","text":"To read in the values of the catalog file we will open using a line-oriented data structure assuming that there is a newline at the end of each record. We can then just the json library's loads() function which will convert each line to a JSON object. Sample Objects.json file: 1 2 3 4 {\"name\":\"Ann\",\"age\":15} {\"name\":\"Peggy\",\"age\":16} {\"name\":\"Rima\",\"age\":13} {\"name\":\"Sue\",\"age\":14} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import os , json json_file = \"objects.json\" script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/' + json_file f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : line_in_json = json . loads ( line ) count += 1 print ( count , ' ' , end = '' ) print ( line_in_json ) # the result is a Python dictionary print ( line_in_json [ 'name' ]) print ( \"Name:\" , line_to_json [ \"name\" ] ) print ( \"Age:\" , line_to_json [ \"age\" ] ) Returns 1 2 3 4 5 6 7 8 9 10 11 12 1 {' name ' : ' Ann ' , ' age ' : 15 } Name : Ann Age : 15 2 {' name ' : ' Peggy ' , ' age ' : 16 } Name : Peggy Age : 16 3 {' name ' : ' Rima ' , ' age ' : 13 } Name : Rima Age : 13 4 {' name ' : ' Sue ' , ' age ' : 14 } Name : Sue Age : 14","title":"Reading Catalog Lines to JSON Objects"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#sample-catalog-reader-program","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 print ( ' \\n\\n line:' , count ) # print(j) print ( \"Index:\" , j [ \"_index\" ] ) print ( \"Session:\" , j [ \"_session_id\" ] ) print ( \"Timestamp:\" , j [ \"_timestamp_ms\" ] ) print ( \"cam/image_array:\" , j [ \"cam/image_array\" ] ) print ( \"user/angle:\" , j [ \"user/angle\" ] ) print ( \"user/mode:\" , j [ \"user/mode\" ] ) print ( \"user/throttle:\" , j [ \"user/throttle\" ] ) returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 line : 1 Index : 16000 Session : 21 - 07 - 20 _0 Timestamp : 1626797545360 cam / image_array : 16000 _cam_image_array_ . jpg user / angle : 1.0 user / mode : user user / throttle : 0.31 line : 2 Index : 16001 Session : 21 - 07 - 20 _0 Timestamp : 1626797545411 cam / image_array : 16001 _cam_image_array_ . jpg user / angle : 0.3715323343607898 user / mode : user user / throttle : 0.31 line : 3 Index : 16002 Session : 21 - 07 - 20 _0 Timestamp : 1626797545460 cam / image_array : 16002 _cam_image_array_ . jpg user / angle : 0.2371288186284982 user / mode : user user / throttle : 0.31","title":"Sample CataLog Reader Program"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#reference","text":"The Python class that creates version 2 of the catalog files is here","title":"Reference"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/","text":"Catalog Statistics Now that we know how to reach each item in the tub catalog, we can now do some simple statistics on this data. For example we can calculate the average throttle and steering angle and create some plots of the distribution of these values. Calculating Average Throttle and Angle When we drive around the track each image records both the throttle and steering values at the instant the image was taken by the camera. Although the values sent to the Electronic Speed Controller (ESC) and the servo are unique to every car, instead we store values that have been converted to a range between 0 and 1. Both these values are Normalized to values of between 0 and 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 total_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] print ( count , \"items in dictionary\" ) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) returns: 1 2 3 100 items in dictionary Average throttle : 0.31 Average angle : 0.53 These values look reasonable. Our throttle should be between 0 and 1 and our average steering should be around 0.5. If we drive in a pure circle only in a single direction the average angle will be offset from the 0.5 center value. Viewing Min and Max values 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 min_throttle = 1 max_throttle = 0 total_angle = 0 min_angle = 1 max_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] # check for min and max throttle if j [ \"user/throttle\" ] < min_throttle : min_throttle = j [ \"user/throttle\" ] if j [ \"user/throttle\" ] > max_throttle : max_throttle = j [ \"user/throttle\" ] if j [ \"user/angle\" ] < min_angle : min_angle = j [ \"user/angle\" ] if j [ \"user/angle\" ] > max_angle : max_angle = j [ \"user/angle\" ] print ( ' \\n ' ) print ( count , \"items in catalog\" ) print ( \"Min throttle:\" , round ( min_throttle , 3 )) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Max throttle:\" , round ( max_throttle , 3 )) print ( \"Min angle:\" , round ( min_throttle , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) print ( \"Max angle:\" , round ( max_angle , 3 )) print ( ' \\n ' ) returns: 1 2 3 4 5 6 7 100 items in catalog Min throttle : - 0.31 Average throttle : 0.308 Max throttle : 0.5 Min angle : - 0.31 Average angle : 0.534 Max angle : 1.0 Converting the Dictionary to a DataFrame 1 2 df = pd . DataFrame ( list ( dict . items ())) print ( df ) returns 1 2 3 4 5 6 7 8 0 1 0 _index 16099 1 _session_id 21-07-20_1 2 _timestamp_ms 1626797880229 3 cam/image_array 16099_cam_image_array_.jpg 4 user/angle 0.56914 5 user/mode user 6 user/throttle 0.0632649 Plotting Steering Distributions","title":"Catalog Statistics"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#catalog-statistics","text":"Now that we know how to reach each item in the tub catalog, we can now do some simple statistics on this data. For example we can calculate the average throttle and steering angle and create some plots of the distribution of these values.","title":"Catalog Statistics"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#calculating-average-throttle-and-angle","text":"When we drive around the track each image records both the throttle and steering values at the instant the image was taken by the camera. Although the values sent to the Electronic Speed Controller (ESC) and the servo are unique to every car, instead we store values that have been converted to a range between 0 and 1. Both these values are Normalized to values of between 0 and 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 total_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] print ( count , \"items in dictionary\" ) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) returns: 1 2 3 100 items in dictionary Average throttle : 0.31 Average angle : 0.53 These values look reasonable. Our throttle should be between 0 and 1 and our average steering should be around 0.5. If we drive in a pure circle only in a single direction the average angle will be offset from the 0.5 center value.","title":"Calculating Average Throttle and Angle"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#viewing-min-and-max-values","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 min_throttle = 1 max_throttle = 0 total_angle = 0 min_angle = 1 max_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] # check for min and max throttle if j [ \"user/throttle\" ] < min_throttle : min_throttle = j [ \"user/throttle\" ] if j [ \"user/throttle\" ] > max_throttle : max_throttle = j [ \"user/throttle\" ] if j [ \"user/angle\" ] < min_angle : min_angle = j [ \"user/angle\" ] if j [ \"user/angle\" ] > max_angle : max_angle = j [ \"user/angle\" ] print ( ' \\n ' ) print ( count , \"items in catalog\" ) print ( \"Min throttle:\" , round ( min_throttle , 3 )) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Max throttle:\" , round ( max_throttle , 3 )) print ( \"Min angle:\" , round ( min_throttle , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) print ( \"Max angle:\" , round ( max_angle , 3 )) print ( ' \\n ' ) returns: 1 2 3 4 5 6 7 100 items in catalog Min throttle : - 0.31 Average throttle : 0.308 Max throttle : 0.5 Min angle : - 0.31 Average angle : 0.534 Max angle : 1.0","title":"Viewing Min and Max values"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#converting-the-dictionary-to-a-dataframe","text":"1 2 df = pd . DataFrame ( list ( dict . items ())) print ( df ) returns 1 2 3 4 5 6 7 8 0 1 0 _index 16099 1 _session_id 21-07-20_1 2 _timestamp_ms 1626797880229 3 cam/image_array 16099_cam_image_array_.jpg 4 user/angle 0.56914 5 user/mode user 6 user/throttle 0.0632649","title":"Converting the Dictionary to a DataFrame"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#plotting-steering-distributions","text":"","title":"Plotting Steering Distributions"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/","text":"Cleaning Datasets Up until now, we have only been viewing metrics and files. These are all read-only operations. Now we will write our first programs that change the tub datasets. Splitting Datasets In this lab we will assume that we want to break our data into two distinct subsets and place them in different \"tubs\", which are just directories that contain both the catalogs and images for a dataset. You can begin by taking a single dataset in a tub and then duplicating that tub. You can then selectively remove the data from the two tubs to effectively split the tubs. The UNIX shell command to copy an entire directly is the \"cp\" command with the \"-r\" option for recursive copy. 1 cp -r from-dir to-dir You can also add the \"-v\" option to see what files are being copied.","title":"Cleaning Datasets"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/#cleaning-datasets","text":"Up until now, we have only been viewing metrics and files. These are all read-only operations. Now we will write our first programs that change the tub datasets.","title":"Cleaning Datasets"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/#splitting-datasets","text":"In this lab we will assume that we want to break our data into two distinct subsets and place them in different \"tubs\", which are just directories that contain both the catalogs and images for a dataset. You can begin by taking a single dataset in a tub and then duplicating that tub. You can then selectively remove the data from the two tubs to effectively split the tubs. The UNIX shell command to copy an entire directly is the \"cp\" command with the \"-r\" option for recursive copy. 1 cp -r from-dir to-dir You can also add the \"-v\" option to see what files are being copied.","title":"Splitting Datasets"},{"location":"lesson-plans/jupyter-notebooks/","text":"Introduction to Jupyter Notebooks and Basic Data Analysis Learning Objectives By the end of this lesson, students should be able to: Understand what Jupyter Notebooks are and how to use them effectively. Load and inspect data from CSV and JSON files in a Jupyter Notebook. Perform basic data analysis using Python libraries such as pandas and matplotlib. Apply their knowledge to analyze data from Donkey Car projects. Required Materials and Preparation Access to a computer with Python, Jupyter Notebooks, pandas, and matplotlib installed. Sample data sets from Donkey Car projects in both CSV and JSON formats. Previous knowledge in Python programming. Lesson Breakdown Lesson 1: Introduction to Jupyter Notebooks (2 hours) 1.1 Lecture: What is a Jupyter Notebook? (30 mins) Definition and purpose Features and benefits of using Jupyter Notebooks 1.2 Hands-on Activity: Getting Started with Jupyter Notebook (90 mins) Launching a Jupyter Notebook Familiarizing with the interface Creating, editing, and executing cells Markdown syntax and use Saving and sharing Jupyter Notebooks Lesson 2: Data Loading and Inspection in Jupyter Notebooks (2 hours) 2.1 Lecture: Basics of pandas (30 mins) Overview of pandas Creating dataframes Basic dataframe operations 2.2 Hands-on Activity: Loading and Inspecting Data (90 mins) Reading data from CSV and JSON files with pandas Inspecting data: checking the dimensions, viewing the first/last few rows, data types Data summary statistics: using describe() Lesson 3: Basic Data Analysis in Jupyter Notebooks (3 hours) 3.1 Lecture: Data Analysis with pandas (30 mins) Filtering and selecting data Grouping and aggregation Basic plotting with pandas 3.2 Hands-on Activity: Basic Data Analysis (150 mins) Practical exercises for data selection, filtering, and aggregation Creating basic plots to visualize data insights Exploring the data to answer exploratory questions Lesson 4: Data Analysis of Donkey Car Project Data (3 hours) 4.1 Recap: Overview of the Donkey Car project (30 mins) Overview of the Donkey Car project and the associated datasets 4.2 Hands-on Activity: Donkey Car Data Analysis (150 mins) Loading and inspecting Donkey Car project datasets Performing exploratory data analysis: answering specific questions, making plots, extracting insights Discussion: Sharing insights, potential improvements for the Donkey Car project based on the data Evaluation Students' understanding will be evaluated through their participation in the hands-on activities and the insights they generate from the Donkey Car project's data analysis. An end-of-unit quiz will also be provided to assess their theoretical understanding and practical skills in Jupyter Notebooks and data analysis. Extension Activities Advanced Data Analysis: Introduce students to more advanced data analysis techniques such as correlation analysis, data normalization, and pivot tables. Data Visualization: Teach students about more complex visualizations using libraries such as seaborn or plotly. Machine Learning Introduction: Provide a brief overview of how the data they have analyzed could be used to train a machine learning model.","title":"Jupyter Notebooks"},{"location":"lesson-plans/jupyter-notebooks/#introduction-to-jupyter-notebooks-and-basic-data-analysis","text":"","title":"Introduction to Jupyter Notebooks and Basic Data Analysis"},{"location":"lesson-plans/jupyter-notebooks/#learning-objectives","text":"By the end of this lesson, students should be able to: Understand what Jupyter Notebooks are and how to use them effectively. Load and inspect data from CSV and JSON files in a Jupyter Notebook. Perform basic data analysis using Python libraries such as pandas and matplotlib. Apply their knowledge to analyze data from Donkey Car projects.","title":"Learning Objectives"},{"location":"lesson-plans/jupyter-notebooks/#required-materials-and-preparation","text":"Access to a computer with Python, Jupyter Notebooks, pandas, and matplotlib installed. Sample data sets from Donkey Car projects in both CSV and JSON formats. Previous knowledge in Python programming.","title":"Required Materials and Preparation"},{"location":"lesson-plans/jupyter-notebooks/#lesson-breakdown","text":"Lesson 1: Introduction to Jupyter Notebooks (2 hours) 1.1 Lecture: What is a Jupyter Notebook? (30 mins) Definition and purpose Features and benefits of using Jupyter Notebooks 1.2 Hands-on Activity: Getting Started with Jupyter Notebook (90 mins) Launching a Jupyter Notebook Familiarizing with the interface Creating, editing, and executing cells Markdown syntax and use Saving and sharing Jupyter Notebooks Lesson 2: Data Loading and Inspection in Jupyter Notebooks (2 hours) 2.1 Lecture: Basics of pandas (30 mins) Overview of pandas Creating dataframes Basic dataframe operations 2.2 Hands-on Activity: Loading and Inspecting Data (90 mins) Reading data from CSV and JSON files with pandas Inspecting data: checking the dimensions, viewing the first/last few rows, data types Data summary statistics: using describe() Lesson 3: Basic Data Analysis in Jupyter Notebooks (3 hours) 3.1 Lecture: Data Analysis with pandas (30 mins) Filtering and selecting data Grouping and aggregation Basic plotting with pandas 3.2 Hands-on Activity: Basic Data Analysis (150 mins) Practical exercises for data selection, filtering, and aggregation Creating basic plots to visualize data insights Exploring the data to answer exploratory questions Lesson 4: Data Analysis of Donkey Car Project Data (3 hours) 4.1 Recap: Overview of the Donkey Car project (30 mins) Overview of the Donkey Car project and the associated datasets 4.2 Hands-on Activity: Donkey Car Data Analysis (150 mins) Loading and inspecting Donkey Car project datasets Performing exploratory data analysis: answering specific questions, making plots, extracting insights Discussion: Sharing insights, potential improvements for the Donkey Car project based on the data","title":"Lesson Breakdown"},{"location":"lesson-plans/jupyter-notebooks/#evaluation","text":"Students' understanding will be evaluated through their participation in the hands-on activities and the insights they generate from the Donkey Car project's data analysis. An end-of-unit quiz will also be provided to assess their theoretical understanding and practical skills in Jupyter Notebooks and data analysis.","title":"Evaluation"},{"location":"lesson-plans/jupyter-notebooks/#extension-activities","text":"Advanced Data Analysis: Introduce students to more advanced data analysis techniques such as correlation analysis, data normalization, and pivot tables. Data Visualization: Teach students about more complex visualizations using libraries such as seaborn or plotly. Machine Learning Introduction: Provide a brief overview of how the data they have analyzed could be used to train a machine learning model.","title":"Extension Activities"},{"location":"quizzes/gpu-commands/","text":"","title":"GPU Commands"},{"location":"quizzes/gpu-shell-commands/","text":"GPU Shell Commands Quiz When you use a new GPU server at an AI Racing League event there are many questions you need to have answered about your GPU server. Here is a handy quiz you can use to check your knowledge. The answers to the questions are listed below. Questions Question 1: How would you log into the GPU server using the secure shell program? A) $ login arl@arl1.local B) $ ssh arl@arl1.local C) $ enter arl@arl1.local D) $ connect arl@arl1.local Question 2: How would you check the version of Ubuntu on the GPU server? A) $ version -a B) $ lsb_release -a C) $ ubuntu_version -all D) $ check_ubuntu -a Question 3: What information does the lscpu command provide? A) It provides the CPU information. B) It lists the amount of RAM on the server. C) It checks the disk space. D) It shows per-user disk usage. Question 4: Which command is used to check the total RAM on the GPU server? A) $ free -m B) $ checkram -m C) $ listram -m D) $ raminfo -m Question 5: What does the command df -h / provide? A) It lists per user disk usage. B) It adds a new GPU server user. C) It checks the disk space. D) It monitors the NVIDIA GPU. Question 6: How can a new GPU server user be added? A) $ adduser B) $ newuser C) $ createuser D) $ useradd Question 7: How can you give a user \"sudo\" rights? A) $ sudo usermod -aG sudo B) $ sudo addrights -aG sudo C) $ sudo giverights -aG sudo D) $ sudo addrules -aG sudo Question 8: How can the hostname be changed? A) $ sudo vi hostname B) $ sudo edit hostname C) $ sudo change hostname D) $ sudo alter hostname Question 9: What does the command watch -d -n 0.5 nvidia-smi do? A) It adds a new GPU server user. B) It runs similar to the UNIX top command, but for the GPU. C) It checks the version of Ubuntu. D) It lists the CPU information. Question 10: How would you check the NVIDIA GPU utilization? A) $ checkgpu B) $ nvidia-smi C) $ gpu-utilization D) $ utilization nvidia Answers B) $ ssh arl@arl1.local B) $ lsb_release -a A) It provides the CPU information. A) $ free -m C) It checks the disk space. A) $ adduser A) $ sudo usermod -aG sudo A) $ sudo vi hostname B) It runs similar to the UNIX top command, but for the GPU. B) $ nvidia-smi","title":"GPU Shell Commands Quiz"},{"location":"quizzes/gpu-shell-commands/#gpu-shell-commands-quiz","text":"When you use a new GPU server at an AI Racing League event there are many questions you need to have answered about your GPU server. Here is a handy quiz you can use to check your knowledge. The answers to the questions are listed below.","title":"GPU Shell Commands Quiz"},{"location":"quizzes/gpu-shell-commands/#questions","text":"Question 1: How would you log into the GPU server using the secure shell program? A) $ login arl@arl1.local B) $ ssh arl@arl1.local C) $ enter arl@arl1.local D) $ connect arl@arl1.local Question 2: How would you check the version of Ubuntu on the GPU server? A) $ version -a B) $ lsb_release -a C) $ ubuntu_version -all D) $ check_ubuntu -a Question 3: What information does the lscpu command provide? A) It provides the CPU information. B) It lists the amount of RAM on the server. C) It checks the disk space. D) It shows per-user disk usage. Question 4: Which command is used to check the total RAM on the GPU server? A) $ free -m B) $ checkram -m C) $ listram -m D) $ raminfo -m Question 5: What does the command df -h / provide? A) It lists per user disk usage. B) It adds a new GPU server user. C) It checks the disk space. D) It monitors the NVIDIA GPU. Question 6: How can a new GPU server user be added? A) $ adduser B) $ newuser C) $ createuser D) $ useradd Question 7: How can you give a user \"sudo\" rights? A) $ sudo usermod -aG sudo B) $ sudo addrights -aG sudo C) $ sudo giverights -aG sudo D) $ sudo addrules -aG sudo Question 8: How can the hostname be changed? A) $ sudo vi hostname B) $ sudo edit hostname C) $ sudo change hostname D) $ sudo alter hostname Question 9: What does the command watch -d -n 0.5 nvidia-smi do? A) It adds a new GPU server user. B) It runs similar to the UNIX top command, but for the GPU. C) It checks the version of Ubuntu. D) It lists the CPU information. Question 10: How would you check the NVIDIA GPU utilization? A) $ checkgpu B) $ nvidia-smi C) $ gpu-utilization D) $ utilization nvidia","title":"Questions"},{"location":"quizzes/gpu-shell-commands/#answers","text":"B) $ ssh arl@arl1.local B) $ lsb_release -a A) It provides the CPU information. A) $ free -m C) It checks the disk space. A) $ adduser A) $ sudo usermod -aG sudo A) $ sudo vi hostname B) It runs similar to the UNIX top command, but for the GPU. B) $ nvidia-smi","title":"Answers"},{"location":"setup/battery-options/","text":"Battery Options Getting batteries charged before each event requires some strong organizational skills. Although the LiPo batteries retain a charge for a long time, the RC car batteries must be fully charged the night before each event. Computer Batteries We used several Ankar 2,000 milliamp-hour batteries for powering the cars. The batteries would last for the entire single-day events as long as they were charge before the event and not used to power the cars when not running on the tracks. RC Car Batteries Battery Cables Several participants used long battery cables with a small wire gauge. These cables caused voltage drops that made the cars stop working. We told all teams to use short 8-inch battery cables and most of these problems went away. Sample 1ft Charging Cable","title":"Battery Options"},{"location":"setup/battery-options/#battery-options","text":"Getting batteries charged before each event requires some strong organizational skills. Although the LiPo batteries retain a charge for a long time, the RC car batteries must be fully charged the night before each event.","title":"Battery Options"},{"location":"setup/battery-options/#computer-batteries","text":"We used several Ankar 2,000 milliamp-hour batteries for powering the cars. The batteries would last for the entire single-day events as long as they were charge before the event and not used to power the cars when not running on the tracks.","title":"Computer Batteries"},{"location":"setup/battery-options/#rc-car-batteries","text":"","title":"RC Car Batteries"},{"location":"setup/battery-options/#battery-cables","text":"Several participants used long battery cables with a small wire gauge. These cables caused voltage drops that made the cars stop working. We told all teams to use short 8-inch battery cables and most of these problems went away. Sample 1ft Charging Cable","title":"Battery Cables"},{"location":"setup/calibrate/","text":"Calibrate 1 $ donkey calibrate --channel 0 --bus = 1 Result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... sombrero enabled init PCA9685 on channel 0 address 0x40 bus 1 Using PWM freq : 60 Traceback ( most recent call last ): File \"/home/pi/env/bin/donkey\" , line 33 , in < module > sys . exit ( load_entry_point ( 'donkeycar' , 'console_scripts' , 'donkey' )()) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 500 , in execute_from_command_line c . run ( args [ 2 :]) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 219 , in run c = PCA9685 ( channel , address = address , busnum = busnum , frequency = freq ) File \"/home/pi/projects/donkeycar/donkeycar/parts/actuator.py\" , line 30 , in __init__ self . pwm = Adafruit_PCA9685 . PCA9685 ( address = address ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 75 , in __init__ self . set_all_pwm ( 0 , 0 ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 111 , in set_all_pwm self . _device . write8 ( ALL_LED_ON_L , on & 0xFF ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_GPIO/I2C.py\" , line 114 , in write8 self . _bus . write_byte_data ( self . _address , register , value ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PureIO/smbus.py\" , line 327 , in write_byte_data self . _device . write ( data ) OSError : [ Errno 121 ] Remote I / O error sombrero disabled Diagnostics I2C Detect 1 2 3 4 5 6 7 8 9 10 i2cdetect - y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- I2C Device File 1 2 ls -ld /dev/i2* crw-rw---- 1 root i2c 89, 1 Jul 3 13:17 /dev/i2c-1 I2C Functions Enabled 1 i2cdetect -F 1 returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Functionalities implemented by / dev / i2c - 1 : I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read no SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes Note that both SMBus Block Read and SMBus Block Process Call are set to no. The rest are yes. Upgrade to Python 3.70 1 python3 -m virtualenv -p python3.7 env --system-site-packages 1 2 3 4 5 created virtual environment CPython3 . 7.3 . final . 0 - 32 in 2535 ms creator CPython3Posix ( dest =/ home / pi / env , clear = False , no_vcs_ignore = False , global = True ) seeder FromAppData ( download = False , pip = bundle , setuptools = bundle , wheel = bundle , via = copy , app_data_dir =/ home / pi /. local / share / virtualenv ) added seed packages : pip == 21.1 . 2 , setuptools == 57.0 . 0 , wheel == 0.36 . 2 activators BashActivator , CShellActivator , FishActivator , PowerShellActivator , PythonActivator , XonshActivator 1 python --version 1 Python 3.7.3","title":"Calibrate"},{"location":"setup/calibrate/#calibrate","text":"1 $ donkey calibrate --channel 0 --bus = 1 Result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... sombrero enabled init PCA9685 on channel 0 address 0x40 bus 1 Using PWM freq : 60 Traceback ( most recent call last ): File \"/home/pi/env/bin/donkey\" , line 33 , in < module > sys . exit ( load_entry_point ( 'donkeycar' , 'console_scripts' , 'donkey' )()) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 500 , in execute_from_command_line c . run ( args [ 2 :]) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 219 , in run c = PCA9685 ( channel , address = address , busnum = busnum , frequency = freq ) File \"/home/pi/projects/donkeycar/donkeycar/parts/actuator.py\" , line 30 , in __init__ self . pwm = Adafruit_PCA9685 . PCA9685 ( address = address ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 75 , in __init__ self . set_all_pwm ( 0 , 0 ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 111 , in set_all_pwm self . _device . write8 ( ALL_LED_ON_L , on & 0xFF ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_GPIO/I2C.py\" , line 114 , in write8 self . _bus . write_byte_data ( self . _address , register , value ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PureIO/smbus.py\" , line 327 , in write_byte_data self . _device . write ( data ) OSError : [ Errno 121 ] Remote I / O error sombrero disabled","title":"Calibrate"},{"location":"setup/calibrate/#diagnostics","text":"","title":"Diagnostics"},{"location":"setup/calibrate/#i2c-detect","text":"1 2 3 4 5 6 7 8 9 10 i2cdetect - y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- --","title":"I2C Detect"},{"location":"setup/calibrate/#i2c-device-file","text":"1 2 ls -ld /dev/i2* crw-rw---- 1 root i2c 89, 1 Jul 3 13:17 /dev/i2c-1","title":"I2C Device File"},{"location":"setup/calibrate/#i2c-functions-enabled","text":"1 i2cdetect -F 1 returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Functionalities implemented by / dev / i2c - 1 : I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read no SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes Note that both SMBus Block Read and SMBus Block Process Call are set to no. The rest are yes.","title":"I2C Functions Enabled"},{"location":"setup/calibrate/#upgrade-to-python-370","text":"1 python3 -m virtualenv -p python3.7 env --system-site-packages 1 2 3 4 5 created virtual environment CPython3 . 7.3 . final . 0 - 32 in 2535 ms creator CPython3Posix ( dest =/ home / pi / env , clear = False , no_vcs_ignore = False , global = True ) seeder FromAppData ( download = False , pip = bundle , setuptools = bundle , wheel = bundle , via = copy , app_data_dir =/ home / pi /. local / share / virtualenv ) added seed packages : pip == 21.1 . 2 , setuptools == 57.0 . 0 , wheel == 0.36 . 2 activators BashActivator , CShellActivator , FishActivator , PowerShellActivator , PythonActivator , XonshActivator 1 python --version 1 Python 3.7.3","title":"Upgrade to Python 3.70"},{"location":"setup/camera-testing/","text":"Testing the Camera To test the camera and cable, we need a command that captures video from a CSI camera connected to an NVIDIA Jetson Nano, converts the video format and resolution, and then displays the video on the screen. We will use the GStreamer command first. GStreamer Test on the Nano 1 $ gst-launch-1.0 nvarguscamerasrc sensor_mode = 0 ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method = 0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e This command is a GStreamer command used to test the functionality of a camera on a NVIDIA Jetson Nano device. GStreamer is a multimedia framework that provides a pipeline for media data. The gst-launch-1.0 utility is used to build and run basic GStreamer pipelines. Here's a breakdown of the command: nvarguscamerasrc sensor_mode=0 : This is a GStreamer plugin specific to the NVIDIA platform that provides support for the Camera Serial Interface (CSI) cameras. sensor_mode=0 indicates that the command should use the first sensor mode of the camera. The sensor mode usually defines properties such as the resolution and frame rate that the camera supports. 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' : This part of the command specifies the desired output from the camera source. The properties indicate that the video should be in NV12 format, with a resolution of 3820x2464 pixels and a frame rate of 21 frames per second. NVMM refers to NVIDIA's proprietary multimedia memory. nvvidconv flip-method=0 : This is another NVIDIA specific GStreamer plugin that converts video from one format to another. The flip-method=0 option means that no flipping operation should be performed on the frames. 'video/x-raw,width=960, height=616' : This specifies the desired output format and resolution after the conversion. The resolution is downscaled to 960x616 pixels. nvvidconv ! nvegltransform ! nveglglessink -e : This part of the pipeline takes the video from the conversion, applies an EGLStream transformation ( nvegltransform ) and then sends it to a EGL/GLES-based render sink ( nveglglessink ). This sink displays the video on the device's screen. The -e flag at the end of the command tells GStreamer to send an end-of-stream signal when the source stops, which will properly close down the pipeline. Why \"!\" and not \"|\"? In the context of a GStreamer command, the \"!\" (aka bang) character is used to connect different elements of a GStreamer pipeline together. It serves a similar role to the UNIX \"|\" (pipe) character in a regular UNIX shell command, where it's used to pipe the output from one command into another. However, there's an important difference between the two. In a UNIX shell command, the | character sends the standard output (stdout) of one command to the standard input (stdin) of another. In a GStreamer pipeline, the ! character doesn't simply pipe data from one element to the next. Instead, it establishes a connection between two GStreamer elements, allowing them to negotiate formats, buffer management, and other details. This negotiation process can involve more complex operations like format conversion, and it happens before any data is actually transferred. So, in summary, while | and ! might seem similar, the latter is used in GStreamer to create more complex, negotiated connections between different multimedia processing elements. Flip Modes The flip-method property of the nvvidconv (NVIDIA Video Converter) plugin controls the orientation of the output video in the NVIDIA Jetson platform. This is useful for handling scenarios where the camera could be mounted in various orientations. Here are the possible values for the flip-method parameter: 0 (Identity) - No rotation, no vertical flip. 1 (Counterclockwise) - Rotate counter-clockwise 90 degrees. 2 (Rotate 180) - Rotate 180 degrees. 3 (Clockwise) - Rotate clockwise 90 degrees. 4 (Horizontal Flip) - Flip horizontally. 5 (Upper Right Diagonal) - Flip across upper right/lower left diagonal. 6 (Vertical Flip) - Flip vertically. 7 (Upper Left Diagonal) - Flip across upper left/lower right diagonal. Each number corresponds to a specific operation on the video frames. The specific operation will be applied to each frame of the video before it's sent to the next element in the GStreamer pipeline. Resources Dan's Blog NVIDIA CSI Camera GitHub Repo Jetson Hacks Blog https://jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/","title":"Camera Testing"},{"location":"setup/camera-testing/#testing-the-camera","text":"To test the camera and cable, we need a command that captures video from a CSI camera connected to an NVIDIA Jetson Nano, converts the video format and resolution, and then displays the video on the screen. We will use the GStreamer command first.","title":"Testing the Camera"},{"location":"setup/camera-testing/#gstreamer-test-on-the-nano","text":"1 $ gst-launch-1.0 nvarguscamerasrc sensor_mode = 0 ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method = 0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e This command is a GStreamer command used to test the functionality of a camera on a NVIDIA Jetson Nano device. GStreamer is a multimedia framework that provides a pipeline for media data. The gst-launch-1.0 utility is used to build and run basic GStreamer pipelines. Here's a breakdown of the command: nvarguscamerasrc sensor_mode=0 : This is a GStreamer plugin specific to the NVIDIA platform that provides support for the Camera Serial Interface (CSI) cameras. sensor_mode=0 indicates that the command should use the first sensor mode of the camera. The sensor mode usually defines properties such as the resolution and frame rate that the camera supports. 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' : This part of the command specifies the desired output from the camera source. The properties indicate that the video should be in NV12 format, with a resolution of 3820x2464 pixels and a frame rate of 21 frames per second. NVMM refers to NVIDIA's proprietary multimedia memory. nvvidconv flip-method=0 : This is another NVIDIA specific GStreamer plugin that converts video from one format to another. The flip-method=0 option means that no flipping operation should be performed on the frames. 'video/x-raw,width=960, height=616' : This specifies the desired output format and resolution after the conversion. The resolution is downscaled to 960x616 pixels. nvvidconv ! nvegltransform ! nveglglessink -e : This part of the pipeline takes the video from the conversion, applies an EGLStream transformation ( nvegltransform ) and then sends it to a EGL/GLES-based render sink ( nveglglessink ). This sink displays the video on the device's screen. The -e flag at the end of the command tells GStreamer to send an end-of-stream signal when the source stops, which will properly close down the pipeline.","title":"GStreamer Test on the Nano"},{"location":"setup/camera-testing/#why-and-not","text":"In the context of a GStreamer command, the \"!\" (aka bang) character is used to connect different elements of a GStreamer pipeline together. It serves a similar role to the UNIX \"|\" (pipe) character in a regular UNIX shell command, where it's used to pipe the output from one command into another. However, there's an important difference between the two. In a UNIX shell command, the | character sends the standard output (stdout) of one command to the standard input (stdin) of another. In a GStreamer pipeline, the ! character doesn't simply pipe data from one element to the next. Instead, it establishes a connection between two GStreamer elements, allowing them to negotiate formats, buffer management, and other details. This negotiation process can involve more complex operations like format conversion, and it happens before any data is actually transferred. So, in summary, while | and ! might seem similar, the latter is used in GStreamer to create more complex, negotiated connections between different multimedia processing elements.","title":"Why \"!\" and not \"|\"?"},{"location":"setup/camera-testing/#flip-modes","text":"The flip-method property of the nvvidconv (NVIDIA Video Converter) plugin controls the orientation of the output video in the NVIDIA Jetson platform. This is useful for handling scenarios where the camera could be mounted in various orientations. Here are the possible values for the flip-method parameter: 0 (Identity) - No rotation, no vertical flip. 1 (Counterclockwise) - Rotate counter-clockwise 90 degrees. 2 (Rotate 180) - Rotate 180 degrees. 3 (Clockwise) - Rotate clockwise 90 degrees. 4 (Horizontal Flip) - Flip horizontally. 5 (Upper Right Diagonal) - Flip across upper right/lower left diagonal. 6 (Vertical Flip) - Flip vertically. 7 (Upper Left Diagonal) - Flip across upper left/lower right diagonal. Each number corresponds to a specific operation on the video frames. The specific operation will be applied to each frame of the video before it's sent to the next element in the GStreamer pipeline.","title":"Flip Modes"},{"location":"setup/camera-testing/#resources","text":"","title":"Resources"},{"location":"setup/camera-testing/#dans-blog","text":"NVIDIA CSI Camera GitHub Repo","title":"Dan's Blog"},{"location":"setup/camera-testing/#jetson-hacks-blog","text":"https://jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/","title":"Jetson Hacks Blog"},{"location":"setup/conda-pi-setup/","text":"Raspberry Pi Setup Install Conda for the ARM Processor When asked: Do you wish the installer to prepend the Miniconda3 install location to PATH in your /root/.bashrc? Answer: yes 1 2 3 4 cd /tmp wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh chmod 755 Miniconda3-latest-Linux-armv7l.sh ./Miniconda3-latest-Linux-armv7l.sh Test Conda In Your PATH 1 which conda Should return: 1 /home/pi/miniconda3/bin/conda Add the Raspberry Pi Channel to Conda 1 2 conda config --add channels rpi conda install python = 3 .6 Test Python 1 python --version 1 Python 3.6.6 Create a DonkeyCar Conda Environment 1 conda create --name donkey python = 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 The following NEW packages will be INSTALLED : ca - certificates : 2018.8.24 - 0 rpi certifi : 2018.8.24 - py36_1 rpi ncurses : 6.1 - h4f752ac_1 rpi openssl : 1.0.2 r - hdff2a78_0 rpi pip : 18.0 - py36_1 rpi python : 3.6.6 - hd0568c0_1 rpi readline : 7.0 - hcb560eb_1 rpi setuptools : 40.2.0 - py36_0 rpi sqlite : 3.24.0 - hfcb1bcf_1 rpi tk : 8.6.8 - h849d6a0_0 rpi wheel : 0.31.1 - py36_1 rpi xz : 5.2.4 - hdff2a78_1 rpi zlib : 1.2.11 - hdff2a78_1003 rpi Proceed ( [ y ]/ n ) ? y Add the conda shell to the end of our .bashrc file 1 echo \". /home/pi/miniconda3/etc/profile.d/conda.sh\" >> ~/.bashrc 1 conda activate The shell prompt should now be \"base\" Activate Your Donkey Python Environment 1 source activate donkey You should see the prompt: 1 ( donkey ) pi @myhost : ~ $ Verify Git Is installed 1 git --version git version 2.20.1 Clone the DonkeyCar repository 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar git checkout master 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test Clone DonkeyCar Repo 1 pip freeze certifi==2018.8.24 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar pip install -e . [ pi ]","title":"Setup Conda on Pi"},{"location":"setup/conda-pi-setup/#raspberry-pi-setup","text":"","title":"Raspberry Pi Setup"},{"location":"setup/conda-pi-setup/#install-conda-for-the-arm-processor","text":"When asked: Do you wish the installer to prepend the Miniconda3 install location to PATH in your /root/.bashrc? Answer: yes 1 2 3 4 cd /tmp wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh chmod 755 Miniconda3-latest-Linux-armv7l.sh ./Miniconda3-latest-Linux-armv7l.sh","title":"Install Conda for the ARM Processor"},{"location":"setup/conda-pi-setup/#test-conda-in-your-path","text":"1 which conda Should return: 1 /home/pi/miniconda3/bin/conda","title":"Test Conda In Your PATH"},{"location":"setup/conda-pi-setup/#add-the-raspberry-pi-channel-to-conda","text":"1 2 conda config --add channels rpi conda install python = 3 .6","title":"Add the Raspberry Pi Channel to Conda"},{"location":"setup/conda-pi-setup/#test-python","text":"1 python --version 1 Python 3.6.6","title":"Test Python"},{"location":"setup/conda-pi-setup/#create-a-donkeycar-conda-environment","text":"1 conda create --name donkey python = 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 The following NEW packages will be INSTALLED : ca - certificates : 2018.8.24 - 0 rpi certifi : 2018.8.24 - py36_1 rpi ncurses : 6.1 - h4f752ac_1 rpi openssl : 1.0.2 r - hdff2a78_0 rpi pip : 18.0 - py36_1 rpi python : 3.6.6 - hd0568c0_1 rpi readline : 7.0 - hcb560eb_1 rpi setuptools : 40.2.0 - py36_0 rpi sqlite : 3.24.0 - hfcb1bcf_1 rpi tk : 8.6.8 - h849d6a0_0 rpi wheel : 0.31.1 - py36_1 rpi xz : 5.2.4 - hdff2a78_1 rpi zlib : 1.2.11 - hdff2a78_1003 rpi Proceed ( [ y ]/ n ) ? y","title":"Create a DonkeyCar Conda Environment"},{"location":"setup/conda-pi-setup/#add-the-conda-shell-to-the-end-of-our-bashrc-file","text":"1 echo \". /home/pi/miniconda3/etc/profile.d/conda.sh\" >> ~/.bashrc 1 conda activate The shell prompt should now be \"base\"","title":"Add the conda shell to the end of our .bashrc file"},{"location":"setup/conda-pi-setup/#activate-your-donkey-python-environment","text":"1 source activate donkey You should see the prompt: 1 ( donkey ) pi @myhost : ~ $","title":"Activate Your Donkey Python Environment"},{"location":"setup/conda-pi-setup/#verify-git-is-installed","text":"1 git --version git version 2.20.1","title":"Verify Git Is installed"},{"location":"setup/conda-pi-setup/#clone-the-donkeycar-repository","text":"1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar git checkout master 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"Clone the DonkeyCar repository"},{"location":"setup/conda-pi-setup/#clone-donkeycar-repo","text":"1 pip freeze certifi==2018.8.24 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar pip install -e . [ pi ]","title":"Clone DonkeyCar Repo"},{"location":"setup/nano-sd-image-checklist/","text":"Nano SD Image Checklist This is a checklist that is genralized for all our events. We can't assume any network connectivity at these events. Required Image is based on the Nvidia Jetson image There is a user \"donkey\" with a password \"car\" The desktop has Chromium and Terminl locked at the top The DonkeyCar Bookmarks are in place The default WiFi is setup and working for the event (use a guest account if we are at company site?) A virtual envinroment is setup and the user is set to that automatically at the end of the .basrc script The Latest DonkeyCar software installed consistently and tested Optional Swap file setup (at least 6 gig) for compiling OpenCV The CSI Camera demo is installed from the Jetson Hacks site to test the camera and do face recognition demos The evtest program in installed to test the Logitech F710 joystick The default config.py and myconfig.py are setup and customized for the CSI camera The default image in the config.py file is 224X224 The \"desktop\" apps (word processing, spreadsheets, presentations) have been removed from the default dock The Chrome browser and the Terminal are on the dock The Chome bookmark bar is enabled (go to the Chrome Settings) The latest version of OpenCV (cv2) is installed, compiled and tested Decent python editor? Jupyter notebook support (arm version!) Sample Jupyter notebooks installed for viewing tub data and cleaning up the tub files (removing data with no speed) Unknowns Can we write a menu-driven UNIX script that will automatically copy tubs to a GPU server and get a model back? Can we assign static IP addresses and names to each car (dk1, dk2, dk3) Can we assume that ALL cars use the same default calibration? Can we write a short test script to verify that all the components are installed and working? What standards should we have for the GPU servers (Ubuntu, not RedHat) What other","title":"Nano SD Image Checklist"},{"location":"setup/nano-sd-image-checklist/#nano-sd-image-checklist","text":"This is a checklist that is genralized for all our events. We can't assume any network connectivity at these events.","title":"Nano SD Image Checklist"},{"location":"setup/nano-sd-image-checklist/#required","text":"Image is based on the Nvidia Jetson image There is a user \"donkey\" with a password \"car\" The desktop has Chromium and Terminl locked at the top The DonkeyCar Bookmarks are in place The default WiFi is setup and working for the event (use a guest account if we are at company site?) A virtual envinroment is setup and the user is set to that automatically at the end of the .basrc script The Latest DonkeyCar software installed consistently and tested","title":"Required"},{"location":"setup/nano-sd-image-checklist/#optional","text":"Swap file setup (at least 6 gig) for compiling OpenCV The CSI Camera demo is installed from the Jetson Hacks site to test the camera and do face recognition demos The evtest program in installed to test the Logitech F710 joystick The default config.py and myconfig.py are setup and customized for the CSI camera The default image in the config.py file is 224X224 The \"desktop\" apps (word processing, spreadsheets, presentations) have been removed from the default dock The Chrome browser and the Terminal are on the dock The Chome bookmark bar is enabled (go to the Chrome Settings) The latest version of OpenCV (cv2) is installed, compiled and tested Decent python editor? Jupyter notebook support (arm version!) Sample Jupyter notebooks installed for viewing tub data and cleaning up the tub files (removing data with no speed)","title":"Optional"},{"location":"setup/nano-sd-image-checklist/#unknowns","text":"Can we write a menu-driven UNIX script that will automatically copy tubs to a GPU server and get a model back? Can we assign static IP addresses and names to each car (dk1, dk2, dk3) Can we assume that ALL cars use the same default calibration? Can we write a short test script to verify that all the components are installed and working? What standards should we have for the GPU servers (Ubuntu, not RedHat) What other","title":"Unknowns"},{"location":"setup/pre-drive-checklist/","text":"DonkeyCar Pre-Drive Checklist Do you have all the software installed correctly? dependencies installed donkey command workings Do you have your PWM Board working? LED light on the PWM card i2cdetect working Battery checks Voltage in the motor battery is 7.2 volts Power level in SBC battery is 100% Configuration File Streering and Throttle calibrated","title":"DonkeyCar Pre-Drive Checklist"},{"location":"setup/pre-drive-checklist/#donkeycar-pre-drive-checklist","text":"Do you have all the software installed correctly? dependencies installed donkey command workings Do you have your PWM Board working? LED light on the PWM card i2cdetect working Battery checks Voltage in the motor battery is 7.2 volts Power level in SBC battery is 100% Configuration File Streering and Throttle calibrated","title":"DonkeyCar Pre-Drive Checklist"},{"location":"setup/pwm-board/","text":"PWM Board Deep Dive The DonkeyCar uses the low cost PCA9685 PWM board. PCA9685 PWM Board Pi 40 Pin Header Connections References Connections Handown (PowerPoint) Using a PCA9685 module with Raspberry Pi","title":"PWM Setup"},{"location":"setup/pwm-board/#pwm-board-deep-dive","text":"The DonkeyCar uses the low cost PCA9685 PWM board.","title":"PWM Board Deep Dive"},{"location":"setup/pwm-board/#pca9685-pwm-board","text":"","title":"PCA9685 PWM Board"},{"location":"setup/pwm-board/#pi-40-pin-header","text":"","title":"Pi 40 Pin Header"},{"location":"setup/pwm-board/#connections","text":"","title":"Connections"},{"location":"setup/pwm-board/#references","text":"Connections Handown (PowerPoint) Using a PCA9685 module with Raspberry Pi","title":"References"},{"location":"setup/software-install-notes/","text":"AI Racing League Software Installation Apt-get Apt-get is the software package installed on the Raspberry Pi OS that allows you to install application libraries. DonkeyCar Libraries (required) 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp build-essential is the library that tracks software library dependency lists. python3 is the library that runs Python 3. Note that the Raspberry Pi only has Python 2.7 as the default version. All our DonkeyCar software requires Python 3.7. python3-dev includes software development tools to manage python 3. python3-pip is the pip tool that allows you to install a specific version of a python library python-virtualenv is the tool that allows you to setup a virtual environment for the DonkeyCar specific libraries. We use this tool instead of the conda tools. python3-numpy are the numerical procssing python libraries. python3-picamera are the libaries to work with the camera on the Raspberry pi. python3-pandas are tools that allow data access for example reading CSV and JSON files. python2-rpi are python libraries that work with the Raspberry Pi. i2ctools are tools that allow you to work with the I2C communications bus. This is the bus that is used to control the PWM board and which controls the throttle and steering. The other libraries are mostly small support libraries used for supporting debugging. OpenCV (optional) 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"Software Installation Notes"},{"location":"setup/software-install-notes/#ai-racing-league-software-installation","text":"","title":"AI Racing League Software Installation"},{"location":"setup/software-install-notes/#apt-get","text":"Apt-get is the software package installed on the Raspberry Pi OS that allows you to install application libraries.","title":"Apt-get"},{"location":"setup/software-install-notes/#donkeycar-libraries-required","text":"1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp build-essential is the library that tracks software library dependency lists. python3 is the library that runs Python 3. Note that the Raspberry Pi only has Python 2.7 as the default version. All our DonkeyCar software requires Python 3.7. python3-dev includes software development tools to manage python 3. python3-pip is the pip tool that allows you to install a specific version of a python library python-virtualenv is the tool that allows you to setup a virtual environment for the DonkeyCar specific libraries. We use this tool instead of the conda tools. python3-numpy are the numerical procssing python libraries. python3-picamera are the libaries to work with the camera on the Raspberry pi. python3-pandas are tools that allow data access for example reading CSV and JSON files. python2-rpi are python libraries that work with the Raspberry Pi. i2ctools are tools that allow you to work with the I2C communications bus. This is the bus that is used to control the PWM board and which controls the throttle and steering. The other libraries are mostly small support libraries used for supporting debugging.","title":"DonkeyCar Libraries (required)"},{"location":"setup/software-install-notes/#opencv-optional","text":"1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"OpenCV (optional)"},{"location":"setup/track-options/","text":"Track Options Although you can just put tape down on a floor, that is time-consuming and is often a low-quality track. There are several other options and the prices vary from under $100 to $1,300. In Minnesota, Billboard Tarps sells used vinyl sign material. For around $70 you can get a 16' X 25' used black billboard vinyl sign that is ideal for creating your own track. Billboard Tarps and Vinyl - We suggest you get a dark color (black or dark blue) and then tape down white edges and a yellow dashed line in the center. Picking the Right Size The typical dimensions of a full-event track is 22 x 34 feet. These dimensions are based on the DIYRobocars Standard Track , which is a popular track for donkey car racing. The smaller track is a good option for beginners, as it is easier to navigate and control. The larger track is a better option for experienced drivers, as it offers more challenges and opportunities for speed. Of course, the dimensions of a donkey car track can vary depending on the specific design. However, the dimensions listed above are a good starting point for anyone who is planning to build or race a donkey car. Keeping A Standard Width The standard width of all the \"road\" tracks is two feet or 24 inches. This is the distance to the centerline of the white edges. The roads are typically black with a white edge and a dashed yellow line down the middle of the track. The key is to have a high contrast between the black road and the white edges. Many people use 2\" (or 1 and 7/8\") inch wide duct tape or Gaffers tape. Gaffer's tape is often preferred for temporary events on carpet. Gaffer's tape doesn't harm the surface to which it adhered. Minnesota STEM Partners Tracks Below is a sample of a tarp purchased from Billboard Tarps. Note the actual track is twice this size since it is still folded in half in this photo. Track setup in the driver training room: Note that this track does not adhere to the 2-foot wide rule. This is sometimes done when you have many students doing practice driving on the same track. Optum Track Optum printed their own track on a local printer that specialized in printing large format signage. The custom printing cost was about $1,300.00 Best Buy Track Best Buy also printed its own track for their events. This photo only shows about 1/3 of the track. Dan McCreary's Basement Track This track is just a single piece of white electrical tape. Interlocking Foam Mats You can also purchase interlocking foam mats. These are typically two feet by two feet and cost about $30 for a package of 6. Since each package covers 24 square feet and a full track is about 24x36 feet (758 square feet) we can see the cost of 32 packages is around $960.00. Interlocking Foam Mats From WalMart Amazon Foam Mats References DIYRobocars Standard Track","title":"Track Options"},{"location":"setup/track-options/#track-options","text":"Although you can just put tape down on a floor, that is time-consuming and is often a low-quality track. There are several other options and the prices vary from under $100 to $1,300. In Minnesota, Billboard Tarps sells used vinyl sign material. For around $70 you can get a 16' X 25' used black billboard vinyl sign that is ideal for creating your own track. Billboard Tarps and Vinyl - We suggest you get a dark color (black or dark blue) and then tape down white edges and a yellow dashed line in the center.","title":"Track Options"},{"location":"setup/track-options/#picking-the-right-size","text":"The typical dimensions of a full-event track is 22 x 34 feet. These dimensions are based on the DIYRobocars Standard Track , which is a popular track for donkey car racing. The smaller track is a good option for beginners, as it is easier to navigate and control. The larger track is a better option for experienced drivers, as it offers more challenges and opportunities for speed. Of course, the dimensions of a donkey car track can vary depending on the specific design. However, the dimensions listed above are a good starting point for anyone who is planning to build or race a donkey car.","title":"Picking the Right Size"},{"location":"setup/track-options/#keeping-a-standard-width","text":"The standard width of all the \"road\" tracks is two feet or 24 inches. This is the distance to the centerline of the white edges. The roads are typically black with a white edge and a dashed yellow line down the middle of the track. The key is to have a high contrast between the black road and the white edges. Many people use 2\" (or 1 and 7/8\") inch wide duct tape or Gaffers tape. Gaffer's tape is often preferred for temporary events on carpet. Gaffer's tape doesn't harm the surface to which it adhered.","title":"Keeping A Standard Width"},{"location":"setup/track-options/#minnesota-stem-partners-tracks","text":"Below is a sample of a tarp purchased from Billboard Tarps. Note the actual track is twice this size since it is still folded in half in this photo. Track setup in the driver training room: Note that this track does not adhere to the 2-foot wide rule. This is sometimes done when you have many students doing practice driving on the same track.","title":"Minnesota STEM Partners Tracks"},{"location":"setup/track-options/#optum-track","text":"Optum printed their own track on a local printer that specialized in printing large format signage. The custom printing cost was about $1,300.00","title":"Optum Track"},{"location":"setup/track-options/#best-buy-track","text":"Best Buy also printed its own track for their events. This photo only shows about 1/3 of the track.","title":"Best Buy Track"},{"location":"setup/track-options/#dan-mccrearys-basement-track","text":"This track is just a single piece of white electrical tape.","title":"Dan McCreary's Basement Track"},{"location":"setup/track-options/#interlocking-foam-mats","text":"You can also purchase interlocking foam mats. These are typically two feet by two feet and cost about $30 for a package of 6. Since each package covers 24 square feet and a full track is about 24x36 feet (758 square feet) we can see the cost of 32 packages is around $960.00. Interlocking Foam Mats From WalMart Amazon Foam Mats","title":"Interlocking Foam Mats"},{"location":"setup/track-options/#references","text":"DIYRobocars Standard Track","title":"References"},{"location":"training-logs/dans-basement/","text":"Dans Basement Training Log I have a very small track in my basement. I put down a single white line about 3/4 inch wide using white electrical tape. The background was a marble blue expoy floor with a lot of color variation. The surface was very reflective and there were lights in the ceiling with lots of glare. I drove the car around 10 times in each direction and collected around 4,500 images. Catalogs I manually edited the catlog files and then edited the manifest.json file to modify the paths: 1 {\"paths\": [\"catalog_3.catalog\", \"catalog_4.catalog\", \"catalog_5.catalog\", \"catalog_6.catalog\", \"catalog_7.catalog\"] 1 wc -l data/dans-basement/*.catalog 1 2 3 4 5 6 781 data/dans-basement/catalog_3.catalog 1000 data/dans-basement/catalog_4.catalog 1000 data/dans-basement/catalog_5.catalog 1000 data/dans-basement/catalog_6.catalog 750 data/dans-basement/catalog_7.catalog 4531 total This matched the ls -1 ~/mycar/data/dans-basement/images | wc -l command that counted the number of images. I time the training time on the NIVID RTX 2080 and got the model trained in about 1.5 minutes. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 $ time donkey train -- tub =./ data / dans - basement -- model =./ models / dans - basement . h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 05 : 34.259364 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 05 : 34.278301 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.278898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.279098 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.280320 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.281822 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.282037 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.283140 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.283726 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.285524 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.285676 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286176 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286568 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.286793 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 05 : 34.290920 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 05 : 34.291228 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8a05bbb0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.291241 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 05 : 34.291374 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.291795 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.291830 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.291842 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.291852 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.291862 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.291872 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.291881 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.291891 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.291955 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292398 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292782 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.292805 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.366898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 05 : 34.366930 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 05 : 34.366937 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 05 : 34.367194 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.367855 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368446 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368971 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9911 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 05 : 34.370680 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8bec8fa0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.370693 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / dans - basement / catalog_7 . catalog Records # Training 3364 Records # Validation 842 Epoch 1 / 100 2021 - 07 - 26 21 : 05 : 35.291438 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 35.613762 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 36.322576 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 05 : 36.376195 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 Epoch 00001 : val_loss improved from inf to 0.14744 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 8 s 301 ms / step - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 - val_loss : 0.1474 - val_n_outputs0_loss : 0.1291 - val_n_outputs1_loss : 0.0183 Epoch 2 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 Epoch 00002 : val_loss improved from 0.14744 to 0.09815 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 120 ms / step - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 - val_loss : 0.0981 - val_n_outputs0_loss : 0.0777 - val_n_outputs1_loss : 0.0205 Epoch 3 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 Epoch 00003 : val_loss improved from 0.09815 to 0.07897 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 117 ms / step - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 - val_loss : 0.0790 - val_n_outputs0_loss : 0.0687 - val_n_outputs1_loss : 0.0102 Epoch 4 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 Epoch 00004 : val_loss improved from 0.07897 to 0.07055 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 - val_loss : 0.0705 - val_n_outputs0_loss : 0.0610 - val_n_outputs1_loss : 0.0096 Epoch 5 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 Epoch 00005 : val_loss did not improve from 0.07055 27 / 27 [ ============================== ] - 3 s 105 ms / step - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 - val_loss : 0.0751 - val_n_outputs0_loss : 0.0553 - val_n_outputs1_loss : 0.0198 Epoch 6 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 Epoch 00006 : val_loss improved from 0.07055 to 0.05840 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 - val_loss : 0.0584 - val_n_outputs0_loss : 0.0485 - val_n_outputs1_loss : 0.0099 Epoch 7 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 Epoch 00007 : val_loss improved from 0.05840 to 0.05028 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 - val_loss : 0.0503 - val_n_outputs0_loss : 0.0450 - val_n_outputs1_loss : 0.0053 Epoch 8 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 Epoch 00008 : val_loss improved from 0.05028 to 0.04540 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 - val_loss : 0.0454 - val_n_outputs0_loss : 0.0385 - val_n_outputs1_loss : 0.0069 Epoch 9 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 Epoch 00009 : val_loss improved from 0.04540 to 0.04351 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 - val_loss : 0.0435 - val_n_outputs0_loss : 0.0358 - val_n_outputs1_loss : 0.0077 Epoch 10 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 Epoch 00010 : val_loss improved from 0.04351 to 0.04070 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 - val_loss : 0.0407 - val_n_outputs0_loss : 0.0357 - val_n_outputs1_loss : 0.0050 Epoch 11 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 Epoch 00011 : val_loss improved from 0.04070 to 0.03935 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 109 ms / step - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 - val_loss : 0.0393 - val_n_outputs0_loss : 0.0340 - val_n_outputs1_loss : 0.0054 Epoch 12 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 Epoch 00012 : val_loss improved from 0.03935 to 0.03624 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 - val_loss : 0.0362 - val_n_outputs0_loss : 0.0298 - val_n_outputs1_loss : 0.0065 Epoch 13 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 Epoch 00013 : val_loss improved from 0.03624 to 0.03507 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 - val_loss : 0.0351 - val_n_outputs0_loss : 0.0294 - val_n_outputs1_loss : 0.0057 Epoch 14 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 Epoch 00014 : val_loss improved from 0.03507 to 0.03211 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0265 - val_n_outputs1_loss : 0.0056 Epoch 15 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 Epoch 00015 : val_loss improved from 0.03211 to 0.03208 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0279 - val_n_outputs1_loss : 0.0042 Epoch 16 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 Epoch 00016 : val_loss improved from 0.03208 to 0.02880 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 - val_loss : 0.0288 - val_n_outputs0_loss : 0.0243 - val_n_outputs1_loss : 0.0046 Epoch 17 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 Epoch 00017 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 - val_loss : 0.0322 - val_n_outputs0_loss : 0.0281 - val_n_outputs1_loss : 0.0041 Epoch 18 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 Epoch 00018 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0257 - val_n_outputs1_loss : 0.0036 Epoch 19 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 Epoch 00019 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 - val_loss : 0.0307 - val_n_outputs0_loss : 0.0275 - val_n_outputs1_loss : 0.0032 Epoch 20 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 Epoch 00020 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 - val_loss : 0.0325 - val_n_outputs0_loss : 0.0283 - val_n_outputs1_loss : 0.0042 Epoch 21 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 Epoch 00021 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0258 - val_n_outputs1_loss : 0.0035 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m26 . 930 s user 1 m30 . 911 s sys 0 m42 . 818 s","title":"Dan's Basement"},{"location":"training-logs/dans-basement/#dans-basement-training-log","text":"I have a very small track in my basement. I put down a single white line about 3/4 inch wide using white electrical tape. The background was a marble blue expoy floor with a lot of color variation. The surface was very reflective and there were lights in the ceiling with lots of glare. I drove the car around 10 times in each direction and collected around 4,500 images.","title":"Dans Basement Training Log"},{"location":"training-logs/dans-basement/#catalogs","text":"I manually edited the catlog files and then edited the manifest.json file to modify the paths: 1 {\"paths\": [\"catalog_3.catalog\", \"catalog_4.catalog\", \"catalog_5.catalog\", \"catalog_6.catalog\", \"catalog_7.catalog\"] 1 wc -l data/dans-basement/*.catalog 1 2 3 4 5 6 781 data/dans-basement/catalog_3.catalog 1000 data/dans-basement/catalog_4.catalog 1000 data/dans-basement/catalog_5.catalog 1000 data/dans-basement/catalog_6.catalog 750 data/dans-basement/catalog_7.catalog 4531 total This matched the ls -1 ~/mycar/data/dans-basement/images | wc -l command that counted the number of images. I time the training time on the NIVID RTX 2080 and got the model trained in about 1.5 minutes. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 $ time donkey train -- tub =./ data / dans - basement -- model =./ models / dans - basement . h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 05 : 34.259364 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 05 : 34.278301 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.278898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.279098 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.280320 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.281822 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.282037 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.283140 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.283726 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.285524 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.285676 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286176 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286568 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.286793 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 05 : 34.290920 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 05 : 34.291228 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8a05bbb0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.291241 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 05 : 34.291374 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.291795 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.291830 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.291842 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.291852 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.291862 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.291872 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.291881 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.291891 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.291955 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292398 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292782 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.292805 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.366898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 05 : 34.366930 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 05 : 34.366937 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 05 : 34.367194 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.367855 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368446 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368971 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9911 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 05 : 34.370680 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8bec8fa0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.370693 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / dans - basement / catalog_7 . catalog Records # Training 3364 Records # Validation 842 Epoch 1 / 100 2021 - 07 - 26 21 : 05 : 35.291438 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 35.613762 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 36.322576 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 05 : 36.376195 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 Epoch 00001 : val_loss improved from inf to 0.14744 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 8 s 301 ms / step - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 - val_loss : 0.1474 - val_n_outputs0_loss : 0.1291 - val_n_outputs1_loss : 0.0183 Epoch 2 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 Epoch 00002 : val_loss improved from 0.14744 to 0.09815 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 120 ms / step - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 - val_loss : 0.0981 - val_n_outputs0_loss : 0.0777 - val_n_outputs1_loss : 0.0205 Epoch 3 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 Epoch 00003 : val_loss improved from 0.09815 to 0.07897 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 117 ms / step - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 - val_loss : 0.0790 - val_n_outputs0_loss : 0.0687 - val_n_outputs1_loss : 0.0102 Epoch 4 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 Epoch 00004 : val_loss improved from 0.07897 to 0.07055 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 - val_loss : 0.0705 - val_n_outputs0_loss : 0.0610 - val_n_outputs1_loss : 0.0096 Epoch 5 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 Epoch 00005 : val_loss did not improve from 0.07055 27 / 27 [ ============================== ] - 3 s 105 ms / step - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 - val_loss : 0.0751 - val_n_outputs0_loss : 0.0553 - val_n_outputs1_loss : 0.0198 Epoch 6 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 Epoch 00006 : val_loss improved from 0.07055 to 0.05840 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 - val_loss : 0.0584 - val_n_outputs0_loss : 0.0485 - val_n_outputs1_loss : 0.0099 Epoch 7 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 Epoch 00007 : val_loss improved from 0.05840 to 0.05028 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 - val_loss : 0.0503 - val_n_outputs0_loss : 0.0450 - val_n_outputs1_loss : 0.0053 Epoch 8 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 Epoch 00008 : val_loss improved from 0.05028 to 0.04540 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 - val_loss : 0.0454 - val_n_outputs0_loss : 0.0385 - val_n_outputs1_loss : 0.0069 Epoch 9 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 Epoch 00009 : val_loss improved from 0.04540 to 0.04351 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 - val_loss : 0.0435 - val_n_outputs0_loss : 0.0358 - val_n_outputs1_loss : 0.0077 Epoch 10 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 Epoch 00010 : val_loss improved from 0.04351 to 0.04070 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 - val_loss : 0.0407 - val_n_outputs0_loss : 0.0357 - val_n_outputs1_loss : 0.0050 Epoch 11 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 Epoch 00011 : val_loss improved from 0.04070 to 0.03935 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 109 ms / step - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 - val_loss : 0.0393 - val_n_outputs0_loss : 0.0340 - val_n_outputs1_loss : 0.0054 Epoch 12 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 Epoch 00012 : val_loss improved from 0.03935 to 0.03624 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 - val_loss : 0.0362 - val_n_outputs0_loss : 0.0298 - val_n_outputs1_loss : 0.0065 Epoch 13 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 Epoch 00013 : val_loss improved from 0.03624 to 0.03507 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 - val_loss : 0.0351 - val_n_outputs0_loss : 0.0294 - val_n_outputs1_loss : 0.0057 Epoch 14 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 Epoch 00014 : val_loss improved from 0.03507 to 0.03211 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0265 - val_n_outputs1_loss : 0.0056 Epoch 15 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 Epoch 00015 : val_loss improved from 0.03211 to 0.03208 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0279 - val_n_outputs1_loss : 0.0042 Epoch 16 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 Epoch 00016 : val_loss improved from 0.03208 to 0.02880 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 - val_loss : 0.0288 - val_n_outputs0_loss : 0.0243 - val_n_outputs1_loss : 0.0046 Epoch 17 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 Epoch 00017 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 - val_loss : 0.0322 - val_n_outputs0_loss : 0.0281 - val_n_outputs1_loss : 0.0041 Epoch 18 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 Epoch 00018 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0257 - val_n_outputs1_loss : 0.0036 Epoch 19 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 Epoch 00019 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 - val_loss : 0.0307 - val_n_outputs0_loss : 0.0275 - val_n_outputs1_loss : 0.0032 Epoch 20 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 Epoch 00020 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 - val_loss : 0.0325 - val_n_outputs0_loss : 0.0283 - val_n_outputs1_loss : 0.0042 Epoch 21 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 Epoch 00021 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0258 - val_n_outputs1_loss : 0.0035 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m26 . 930 s user 1 m30 . 911 s sys 0 m42 . 818 s","title":"Catalogs"},{"location":"training-logs/msp-1-cpu/","text":"Training Log for MSP Car #1 After cleanup we only got about 1,500 records. But here is a log of the training. It took about 1.5 minutes. 1 $ donkey train --tub = ./data/msp-car-1 --model = ./models/msp-car-1.f5 _ ______ _________ _ _ _ _ / _ _/ __ _ _ / / / _ _ // / _ _ / / / _ / _ `/ / _ / / // / / / / / / ,< / / / / / / / / / / / / / _ / _ // / / // /| | ___/ _ , / ____/ _ , / / / /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021-07-26 19:50:45.562205: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021-07-26 19:50:45.565106: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3592950000 Hz 2021-07-26 19:50:45.565470: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d85e9d19f0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-07-26 19:50:45.565492: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-07-26 19:50:45.565578: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance. Model: \"model\" Layer (type) Output Shape Param # Connected to img_in (InputLayer) [(None, 224, 224, 3) 0 conv2d_1 (Conv2D) (None, 110, 110, 24) 1824 img_in[0][0] dropout (Dropout) (None, 110, 110, 24) 0 conv2d_1[0][0] conv2d_2 (Conv2D) (None, 53, 53, 32) 19232 dropout[0][0] dropout_1 (Dropout) (None, 53, 53, 32) 0 conv2d_2[0][0] conv2d_3 (Conv2D) (None, 25, 25, 64) 51264 dropout_1[0][0] dropout_2 (Dropout) (None, 25, 25, 64) 0 conv2d_3[0][0] conv2d_4 (Conv2D) (None, 23, 23, 64) 36928 dropout_2[0][0] dropout_3 (Dropout) (None, 23, 23, 64) 0 conv2d_4[0][0] conv2d_5 (Conv2D) (None, 21, 21, 64) 36928 dropout_3[0][0] dropout_4 (Dropout) (None, 21, 21, 64) 0 conv2d_5[0][0] flattened (Flatten) (None, 28224) 0 dropout_4[0][0] dense_1 (Dense) (None, 100) 2822500 flattened[0][0] dropout_5 (Dropout) (None, 100) 0 dense_1[0][0] dense_2 (Dense) (None, 50) 5050 dropout_5[0][0] dropout_6 (Dropout) (None, 50) 0 dense_2[0][0] n_outputs0 (Dense) (None, 1) 51 dropout_6[0][0] n_outputs1 (Dense) (None, 1) 51 dropout_6[0][0] Total params: 2,973,828 Trainable params: 2,973,828 Non-trainable params: 0 None Using catalog /home/arl/mycar/data/msp-car-1/catalog_17.catalog Records # Training 1265 Records # Validation 317 Epoch 1/100 10/10 [==============================] - ETA: 0s - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 Epoch 00001: val_loss improved from inf to 0.54341, saving model to ./models/msp-car-1.f5 2021-07-26 19:50:57.881390: W tensorflow/python/util/util.cc:329] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. WARNING:tensorflow:From /home/arl/miniconda3/envs/donkey/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable. init (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 10/10 [==============================] - 11s 1s/step - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 - val_loss: 0.5434 - val_n_outputs0_loss: 0.4668 - val_n_outputs1_loss: 0.0767 Epoch 2/100 10/10 [==============================] - ETA: 0s - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 Epoch 00002: val_loss improved from 0.54341 to 0.53272, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 - val_loss: 0.5327 - val_n_outputs0_loss: 0.4605 - val_n_outputs1_loss: 0.0722 Epoch 3/100 10/10 [==============================] - ETA: 0s - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 Epoch 00003: val_loss improved from 0.53272 to 0.50775, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 - val_loss: 0.5077 - val_n_outputs0_loss: 0.4551 - val_n_outputs1_loss: 0.0527 Epoch 4/100 10/10 [==============================] - ETA: 0s - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 Epoch 00004: val_loss improved from 0.50775 to 0.49783, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 - val_loss: 0.4978 - val_n_outputs0_loss: 0.4455 - val_n_outputs1_loss: 0.0523 Epoch 5/100 10/10 [==============================] - ETA: 0s - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 Epoch 00005: val_loss improved from 0.49783 to 0.49721, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 - val_loss: 0.4972 - val_n_outputs0_loss: 0.4451 - val_n_outputs1_loss: 0.0521 Epoch 6/100 10/10 [==============================] - ETA: 0s - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 Epoch 00006: val_loss did not improve from 0.49721 10/10 [==============================] - 9s 934ms/step - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 - val_loss: 0.4981 - val_n_outputs0_loss: 0.4461 - val_n_outputs1_loss: 0.0520 Epoch 7/100 10/10 [==============================] - ETA: 0s - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 Epoch 00007: val_loss improved from 0.49721 to 0.49668, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 - val_loss: 0.4967 - val_n_outputs0_loss: 0.4442 - val_n_outputs1_loss: 0.0525 Epoch 8/100 10/10 [==============================] - ETA: 0s - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 Epoch 00008: val_loss improved from 0.49668 to 0.49536, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 - val_loss: 0.4954 - val_n_outputs0_loss: 0.4408 - val_n_outputs1_loss: 0.0546 Epoch 9/100 10/10 [==============================] - ETA: 0s - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 Epoch 00009: val_loss improved from 0.49536 to 0.48741, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 - val_loss: 0.4874 - val_n_outputs0_loss: 0.4353 - val_n_outputs1_loss: 0.0521 Epoch 10/100 10/10 [==============================] - ETA: 0s - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 Epoch 00010: val_loss did not improve from 0.48741 10/10 [==============================] - 9s 930ms/step - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 - val_loss: 0.4936 - val_n_outputs0_loss: 0.4351 - val_n_outputs1_loss: 0.0585 Epoch 11/100 10/10 [==============================] - ETA: 0s - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 Epoch 00011: val_loss improved from 0.48741 to 0.47748, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 11s 1s/step - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 - val_loss: 0.4775 - val_n_outputs0_loss: 0.4238 - val_n_outputs1_loss: 0.0536 Epoch 12/100 10/10 [==============================] - ETA: 0s - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 Epoch 00012: val_loss did not improve from 0.47748 10/10 [==============================] - 9s 925ms/step - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 - val_loss: 0.4836 - val_n_outputs0_loss: 0.4148 - val_n_outputs1_loss: 0.0687 Epoch 13/100 10/10 [==============================] - ETA: 0s - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 Epoch 00013: val_loss improved from 0.47748 to 0.40567, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 - val_loss: 0.4057 - val_n_outputs0_loss: 0.3540 - val_n_outputs1_loss: 0.0516 Epoch 14/100 10/10 [==============================] - ETA: 0s - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 Epoch 00014: val_loss improved from 0.40567 to 0.37099, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 - val_loss: 0.3710 - val_n_outputs0_loss: 0.3153 - val_n_outputs1_loss: 0.0556 Epoch 15/100 10/10 [==============================] - ETA: 0s - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 Epoch 00015: val_loss improved from 0.37099 to 0.33956, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 - val_loss: 0.3396 - val_n_outputs0_loss: 0.2853 - val_n_outputs1_loss: 0.0542 Epoch 16/100 10/10 [==============================] - ETA: 0s - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 Epoch 00016: val_loss improved from 0.33956 to 0.30289, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 - val_loss: 0.3029 - val_n_outputs0_loss: 0.2524 - val_n_outputs1_loss: 0.0505 Epoch 17/100 10/10 [==============================] - ETA: 0s - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 Epoch 00017: val_loss improved from 0.30289 to 0.28694, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 - val_loss: 0.2869 - val_n_outputs0_loss: 0.2390 - val_n_outputs1_loss: 0.0479 Epoch 18/100 10/10 [==============================] - ETA: 0s - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 Epoch 00018: val_loss improved from 0.28694 to 0.27270, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 - val_loss: 0.2727 - val_n_outputs0_loss: 0.2257 - val_n_outputs1_loss: 0.0470 Epoch 19/100 10/10 [==============================] - ETA: 0s - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 Epoch 00019: val_loss improved from 0.27270 to 0.25193, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 - val_loss: 0.2519 - val_n_outputs0_loss: 0.2099 - val_n_outputs1_loss: 0.0421 Epoch 20/100 10/10 [==============================] - ETA: 0s - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 Epoch 00020: val_loss improved from 0.25193 to 0.23899, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 - val_loss: 0.2390 - val_n_outputs0_loss: 0.1974 - val_n_outputs1_loss: 0.0416 Epoch 21/100 10/10 [==============================] - ETA: 0s - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 Epoch 00021: val_loss improved from 0.23899 to 0.23396, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 - val_loss: 0.2340 - val_n_outputs0_loss: 0.1911 - val_n_outputs1_loss: 0.0428 Epoch 22/100 10/10 [==============================] - ETA: 0s - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 Epoch 00022: val_loss improved from 0.23396 to 0.22651, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 - val_loss: 0.2265 - val_n_outputs0_loss: 0.1858 - val_n_outputs1_loss: 0.0407 Epoch 23/100 10/10 [==============================] - ETA: 0s - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 Epoch 00023: val_loss improved from 0.22651 to 0.22245, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 - val_loss: 0.2225 - val_n_outputs0_loss: 0.1806 - val_n_outputs1_loss: 0.0419 Epoch 24/100 10/10 [==============================] - ETA: 0s - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 Epoch 00024: val_loss improved from 0.22245 to 0.20674, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 - val_loss: 0.2067 - val_n_outputs0_loss: 0.1694 - val_n_outputs1_loss: 0.0374 Epoch 25/100 10/10 [==============================] - ETA: 0s - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 Epoch 00025: val_loss improved from 0.20674 to 0.20416, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 - val_loss: 0.2042 - val_n_outputs0_loss: 0.1638 - val_n_outputs1_loss: 0.0403 Epoch 26/100 10/10 [==============================] - ETA: 0s - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 Epoch 00026: val_loss improved from 0.20416 to 0.19422, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 - val_loss: 0.1942 - val_n_outputs0_loss: 0.1557 - val_n_outputs1_loss: 0.0385 Epoch 27/100 10/10 [==============================] - ETA: 0s - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 Epoch 00027: val_loss did not improve from 0.19422 10/10 [==============================] - 9s 930ms/step - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 - val_loss: 0.2016 - val_n_outputs0_loss: 0.1615 - val_n_outputs1_loss: 0.0401 Epoch 28/100 10/10 [==============================] - ETA: 0s - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 Epoch 00028: val_loss improved from 0.19422 to 0.18035, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 - val_loss: 0.1803 - val_n_outputs0_loss: 0.1445 - val_n_outputs1_loss: 0.0358 Epoch 29/100 10/10 [==============================] - ETA: 0s - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 Epoch 00029: val_loss improved from 0.18035 to 0.17528, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 - val_loss: 0.1753 - val_n_outputs0_loss: 0.1410 - val_n_outputs1_loss: 0.0343 Epoch 30/100 10/10 [==============================] - ETA: 0s - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 Epoch 00030: val_loss improved from 0.17528 to 0.17039, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 - val_loss: 0.1704 - val_n_outputs0_loss: 0.1372 - val_n_outputs1_loss: 0.0332 Epoch 31/100 10/10 [==============================] - ETA: 0s - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 Epoch 00031: val_loss did not improve from 0.17039 10/10 [==============================] - 9s 915ms/step - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 - val_loss: 0.1783 - val_n_outputs0_loss: 0.1436 - val_n_outputs1_loss: 0.0347 Epoch 32/100 10/10 [==============================] - ETA: 0s - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 Epoch 00032: val_loss improved from 0.17039 to 0.16278, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 - val_loss: 0.1628 - val_n_outputs0_loss: 0.1301 - val_n_outputs1_loss: 0.0327 Epoch 33/100 10/10 [==============================] - ETA: 0s - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 Epoch 00033: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 928ms/step - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 - val_loss: 0.1666 - val_n_outputs0_loss: 0.1345 - val_n_outputs1_loss: 0.0320 Epoch 34/100 10/10 [==============================] - ETA: 0s - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 Epoch 00034: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 - val_loss: 0.1728 - val_n_outputs0_loss: 0.1413 - val_n_outputs1_loss: 0.0315 Epoch 35/100 10/10 [==============================] - ETA: 0s - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 Epoch 00035: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 933ms/step - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 - val_loss: 0.1706 - val_n_outputs0_loss: 0.1391 - val_n_outputs1_loss: 0.0315 Epoch 36/100 10/10 [==============================] - ETA: 0s - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 Epoch 00036: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 936ms/step - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 - val_loss: 0.1729 - val_n_outputs0_loss: 0.1401 - val_n_outputs1_loss: 0.0328 Epoch 37/100 10/10 [==============================] - ETA: 0s - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 Epoch 00037: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 - val_loss: 0.1709 - val_n_outputs0_loss: 0.1381 - val_n_outputs1_loss: 0.0327 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff (donkey) arl@arl1: ```","title":"Training Log for MSP Car #1"},{"location":"training-logs/msp-1-cpu/#training-log-for-msp-car-1","text":"After cleanup we only got about 1,500 records. But here is a log of the training. It took about 1.5 minutes. 1 $ donkey train --tub = ./data/msp-car-1 --model = ./models/msp-car-1.f5 _ ______ _________ _ _ _ _ / _ _/ __ _ _ / / / _ _ // / _ _ / / / _ / _ `/ / _ / / // / / / / / / ,< / / / / / / / / / / / / / _ / _ // / / // /| | ___/ _ , / ____/ _ , / / / /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021-07-26 19:50:45.562205: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021-07-26 19:50:45.565106: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3592950000 Hz 2021-07-26 19:50:45.565470: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d85e9d19f0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-07-26 19:50:45.565492: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-07-26 19:50:45.565578: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance. Model: \"model\"","title":"Training Log for MSP Car #1"},{"location":"training-logs/msp-1-cpu/#layer-type-output-shape-param-connected-to","text":"img_in (InputLayer) [(None, 224, 224, 3) 0 conv2d_1 (Conv2D) (None, 110, 110, 24) 1824 img_in[0][0] dropout (Dropout) (None, 110, 110, 24) 0 conv2d_1[0][0] conv2d_2 (Conv2D) (None, 53, 53, 32) 19232 dropout[0][0] dropout_1 (Dropout) (None, 53, 53, 32) 0 conv2d_2[0][0] conv2d_3 (Conv2D) (None, 25, 25, 64) 51264 dropout_1[0][0] dropout_2 (Dropout) (None, 25, 25, 64) 0 conv2d_3[0][0] conv2d_4 (Conv2D) (None, 23, 23, 64) 36928 dropout_2[0][0] dropout_3 (Dropout) (None, 23, 23, 64) 0 conv2d_4[0][0] conv2d_5 (Conv2D) (None, 21, 21, 64) 36928 dropout_3[0][0] dropout_4 (Dropout) (None, 21, 21, 64) 0 conv2d_5[0][0] flattened (Flatten) (None, 28224) 0 dropout_4[0][0] dense_1 (Dense) (None, 100) 2822500 flattened[0][0] dropout_5 (Dropout) (None, 100) 0 dense_1[0][0] dense_2 (Dense) (None, 50) 5050 dropout_5[0][0] dropout_6 (Dropout) (None, 50) 0 dense_2[0][0] n_outputs0 (Dense) (None, 1) 51 dropout_6[0][0]","title":"Layer (type) Output Shape Param # Connected to"},{"location":"training-logs/msp-1-cpu/#n_outputs1-dense-none-1-51-dropout_600","text":"Total params: 2,973,828 Trainable params: 2,973,828 Non-trainable params: 0 None Using catalog /home/arl/mycar/data/msp-car-1/catalog_17.catalog Records # Training 1265 Records # Validation 317 Epoch 1/100 10/10 [==============================] - ETA: 0s - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 Epoch 00001: val_loss improved from inf to 0.54341, saving model to ./models/msp-car-1.f5 2021-07-26 19:50:57.881390: W tensorflow/python/util/util.cc:329] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. WARNING:tensorflow:From /home/arl/miniconda3/envs/donkey/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable. init (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 10/10 [==============================] - 11s 1s/step - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 - val_loss: 0.5434 - val_n_outputs0_loss: 0.4668 - val_n_outputs1_loss: 0.0767 Epoch 2/100 10/10 [==============================] - ETA: 0s - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 Epoch 00002: val_loss improved from 0.54341 to 0.53272, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 - val_loss: 0.5327 - val_n_outputs0_loss: 0.4605 - val_n_outputs1_loss: 0.0722 Epoch 3/100 10/10 [==============================] - ETA: 0s - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 Epoch 00003: val_loss improved from 0.53272 to 0.50775, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 - val_loss: 0.5077 - val_n_outputs0_loss: 0.4551 - val_n_outputs1_loss: 0.0527 Epoch 4/100 10/10 [==============================] - ETA: 0s - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 Epoch 00004: val_loss improved from 0.50775 to 0.49783, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 - val_loss: 0.4978 - val_n_outputs0_loss: 0.4455 - val_n_outputs1_loss: 0.0523 Epoch 5/100 10/10 [==============================] - ETA: 0s - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 Epoch 00005: val_loss improved from 0.49783 to 0.49721, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 - val_loss: 0.4972 - val_n_outputs0_loss: 0.4451 - val_n_outputs1_loss: 0.0521 Epoch 6/100 10/10 [==============================] - ETA: 0s - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 Epoch 00006: val_loss did not improve from 0.49721 10/10 [==============================] - 9s 934ms/step - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 - val_loss: 0.4981 - val_n_outputs0_loss: 0.4461 - val_n_outputs1_loss: 0.0520 Epoch 7/100 10/10 [==============================] - ETA: 0s - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 Epoch 00007: val_loss improved from 0.49721 to 0.49668, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 - val_loss: 0.4967 - val_n_outputs0_loss: 0.4442 - val_n_outputs1_loss: 0.0525 Epoch 8/100 10/10 [==============================] - ETA: 0s - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 Epoch 00008: val_loss improved from 0.49668 to 0.49536, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 - val_loss: 0.4954 - val_n_outputs0_loss: 0.4408 - val_n_outputs1_loss: 0.0546 Epoch 9/100 10/10 [==============================] - ETA: 0s - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 Epoch 00009: val_loss improved from 0.49536 to 0.48741, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 - val_loss: 0.4874 - val_n_outputs0_loss: 0.4353 - val_n_outputs1_loss: 0.0521 Epoch 10/100 10/10 [==============================] - ETA: 0s - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 Epoch 00010: val_loss did not improve from 0.48741 10/10 [==============================] - 9s 930ms/step - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 - val_loss: 0.4936 - val_n_outputs0_loss: 0.4351 - val_n_outputs1_loss: 0.0585 Epoch 11/100 10/10 [==============================] - ETA: 0s - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 Epoch 00011: val_loss improved from 0.48741 to 0.47748, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 11s 1s/step - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 - val_loss: 0.4775 - val_n_outputs0_loss: 0.4238 - val_n_outputs1_loss: 0.0536 Epoch 12/100 10/10 [==============================] - ETA: 0s - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 Epoch 00012: val_loss did not improve from 0.47748 10/10 [==============================] - 9s 925ms/step - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 - val_loss: 0.4836 - val_n_outputs0_loss: 0.4148 - val_n_outputs1_loss: 0.0687 Epoch 13/100 10/10 [==============================] - ETA: 0s - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 Epoch 00013: val_loss improved from 0.47748 to 0.40567, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 - val_loss: 0.4057 - val_n_outputs0_loss: 0.3540 - val_n_outputs1_loss: 0.0516 Epoch 14/100 10/10 [==============================] - ETA: 0s - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 Epoch 00014: val_loss improved from 0.40567 to 0.37099, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 - val_loss: 0.3710 - val_n_outputs0_loss: 0.3153 - val_n_outputs1_loss: 0.0556 Epoch 15/100 10/10 [==============================] - ETA: 0s - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 Epoch 00015: val_loss improved from 0.37099 to 0.33956, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 - val_loss: 0.3396 - val_n_outputs0_loss: 0.2853 - val_n_outputs1_loss: 0.0542 Epoch 16/100 10/10 [==============================] - ETA: 0s - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 Epoch 00016: val_loss improved from 0.33956 to 0.30289, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 - val_loss: 0.3029 - val_n_outputs0_loss: 0.2524 - val_n_outputs1_loss: 0.0505 Epoch 17/100 10/10 [==============================] - ETA: 0s - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 Epoch 00017: val_loss improved from 0.30289 to 0.28694, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 - val_loss: 0.2869 - val_n_outputs0_loss: 0.2390 - val_n_outputs1_loss: 0.0479 Epoch 18/100 10/10 [==============================] - ETA: 0s - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 Epoch 00018: val_loss improved from 0.28694 to 0.27270, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 - val_loss: 0.2727 - val_n_outputs0_loss: 0.2257 - val_n_outputs1_loss: 0.0470 Epoch 19/100 10/10 [==============================] - ETA: 0s - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 Epoch 00019: val_loss improved from 0.27270 to 0.25193, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 - val_loss: 0.2519 - val_n_outputs0_loss: 0.2099 - val_n_outputs1_loss: 0.0421 Epoch 20/100 10/10 [==============================] - ETA: 0s - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 Epoch 00020: val_loss improved from 0.25193 to 0.23899, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 - val_loss: 0.2390 - val_n_outputs0_loss: 0.1974 - val_n_outputs1_loss: 0.0416 Epoch 21/100 10/10 [==============================] - ETA: 0s - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 Epoch 00021: val_loss improved from 0.23899 to 0.23396, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 - val_loss: 0.2340 - val_n_outputs0_loss: 0.1911 - val_n_outputs1_loss: 0.0428 Epoch 22/100 10/10 [==============================] - ETA: 0s - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 Epoch 00022: val_loss improved from 0.23396 to 0.22651, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 - val_loss: 0.2265 - val_n_outputs0_loss: 0.1858 - val_n_outputs1_loss: 0.0407 Epoch 23/100 10/10 [==============================] - ETA: 0s - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 Epoch 00023: val_loss improved from 0.22651 to 0.22245, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 - val_loss: 0.2225 - val_n_outputs0_loss: 0.1806 - val_n_outputs1_loss: 0.0419 Epoch 24/100 10/10 [==============================] - ETA: 0s - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 Epoch 00024: val_loss improved from 0.22245 to 0.20674, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 - val_loss: 0.2067 - val_n_outputs0_loss: 0.1694 - val_n_outputs1_loss: 0.0374 Epoch 25/100 10/10 [==============================] - ETA: 0s - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 Epoch 00025: val_loss improved from 0.20674 to 0.20416, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 - val_loss: 0.2042 - val_n_outputs0_loss: 0.1638 - val_n_outputs1_loss: 0.0403 Epoch 26/100 10/10 [==============================] - ETA: 0s - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 Epoch 00026: val_loss improved from 0.20416 to 0.19422, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 - val_loss: 0.1942 - val_n_outputs0_loss: 0.1557 - val_n_outputs1_loss: 0.0385 Epoch 27/100 10/10 [==============================] - ETA: 0s - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 Epoch 00027: val_loss did not improve from 0.19422 10/10 [==============================] - 9s 930ms/step - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 - val_loss: 0.2016 - val_n_outputs0_loss: 0.1615 - val_n_outputs1_loss: 0.0401 Epoch 28/100 10/10 [==============================] - ETA: 0s - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 Epoch 00028: val_loss improved from 0.19422 to 0.18035, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 - val_loss: 0.1803 - val_n_outputs0_loss: 0.1445 - val_n_outputs1_loss: 0.0358 Epoch 29/100 10/10 [==============================] - ETA: 0s - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 Epoch 00029: val_loss improved from 0.18035 to 0.17528, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 - val_loss: 0.1753 - val_n_outputs0_loss: 0.1410 - val_n_outputs1_loss: 0.0343 Epoch 30/100 10/10 [==============================] - ETA: 0s - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 Epoch 00030: val_loss improved from 0.17528 to 0.17039, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 - val_loss: 0.1704 - val_n_outputs0_loss: 0.1372 - val_n_outputs1_loss: 0.0332 Epoch 31/100 10/10 [==============================] - ETA: 0s - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 Epoch 00031: val_loss did not improve from 0.17039 10/10 [==============================] - 9s 915ms/step - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 - val_loss: 0.1783 - val_n_outputs0_loss: 0.1436 - val_n_outputs1_loss: 0.0347 Epoch 32/100 10/10 [==============================] - ETA: 0s - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 Epoch 00032: val_loss improved from 0.17039 to 0.16278, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 - val_loss: 0.1628 - val_n_outputs0_loss: 0.1301 - val_n_outputs1_loss: 0.0327 Epoch 33/100 10/10 [==============================] - ETA: 0s - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 Epoch 00033: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 928ms/step - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 - val_loss: 0.1666 - val_n_outputs0_loss: 0.1345 - val_n_outputs1_loss: 0.0320 Epoch 34/100 10/10 [==============================] - ETA: 0s - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 Epoch 00034: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 - val_loss: 0.1728 - val_n_outputs0_loss: 0.1413 - val_n_outputs1_loss: 0.0315 Epoch 35/100 10/10 [==============================] - ETA: 0s - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 Epoch 00035: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 933ms/step - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 - val_loss: 0.1706 - val_n_outputs0_loss: 0.1391 - val_n_outputs1_loss: 0.0315 Epoch 36/100 10/10 [==============================] - ETA: 0s - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 Epoch 00036: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 936ms/step - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 - val_loss: 0.1729 - val_n_outputs0_loss: 0.1401 - val_n_outputs1_loss: 0.0328 Epoch 37/100 10/10 [==============================] - ETA: 0s - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 Epoch 00037: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 - val_loss: 0.1709 - val_n_outputs0_loss: 0.1381 - val_n_outputs1_loss: 0.0327 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff (donkey) arl@arl1: ```","title":"n_outputs1 (Dense) (None, 1) 51 dropout_6[0][0]"},{"location":"training-logs/msp-car-1/","text":"Minnesota STEM Partners Car 1 Training Log 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 time donkey train -- tub =./ data / msp - car - 1 -- model =./ models / msp - car - 1. h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 18 : 57.390998 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 18 : 57.409838 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.410285 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.410424 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.411314 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.412358 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.412506 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.413323 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.413712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.415437 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.415619 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416133 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416523 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.416750 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 18 : 57.420820 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 18 : 57.421125 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cbee7970 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.421136 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 18 : 57.421270 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.421679 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.421712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.421724 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.421735 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.421746 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.421756 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.421766 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.421776 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.421840 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422285 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422675 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.422700 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.504507 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 18 : 57.504534 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 18 : 57.504541 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 18 : 57.504754 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505207 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505632 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.506019 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9892 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 18 : 57.507379 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cdd66f30 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.507389 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / msp - car - 1 / catalog_17 . catalog Records # Training 1265 Records # Validation 317 Epoch 1 / 100 2021 - 07 - 26 21 : 18 : 58.397797 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 58.705078 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 59.429125 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 18 : 59.481809 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 Epoch 00001 : val_loss improved from inf to 0.60297 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 3 s 288 ms / step - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 - val_loss : 0.6030 - val_n_outputs0_loss : 0.4514 - val_n_outputs1_loss : 0.1516 Epoch 2 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 Epoch 00002 : val_loss improved from 0.60297 to 0.51595 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 124 ms / step - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 - val_loss : 0.5160 - val_n_outputs0_loss : 0.4188 - val_n_outputs1_loss : 0.0972 Epoch 3 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 Epoch 00003 : val_loss improved from 0.51595 to 0.50280 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 - val_loss : 0.5028 - val_n_outputs0_loss : 0.4224 - val_n_outputs1_loss : 0.0804 Epoch 4 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 Epoch 00004 : val_loss improved from 0.50280 to 0.49159 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 - val_loss : 0.4916 - val_n_outputs0_loss : 0.4203 - val_n_outputs1_loss : 0.0713 Epoch 5 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 Epoch 00005 : val_loss improved from 0.49159 to 0.48784 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 - val_loss : 0.4878 - val_n_outputs0_loss : 0.4107 - val_n_outputs1_loss : 0.0772 Epoch 6 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 Epoch 00006 : val_loss improved from 0.48784 to 0.48521 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 - val_loss : 0.4852 - val_n_outputs0_loss : 0.4127 - val_n_outputs1_loss : 0.0725 Epoch 7 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 Epoch 00007 : val_loss improved from 0.48521 to 0.48270 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 - val_loss : 0.4827 - val_n_outputs0_loss : 0.4097 - val_n_outputs1_loss : 0.0730 Epoch 8 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 Epoch 00008 : val_loss improved from 0.48270 to 0.47415 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 - val_loss : 0.4741 - val_n_outputs0_loss : 0.4026 - val_n_outputs1_loss : 0.0715 Epoch 9 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 Epoch 00009 : val_loss did not improve from 0.47415 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 - val_loss : 0.4780 - val_n_outputs0_loss : 0.4069 - val_n_outputs1_loss : 0.0711 Epoch 10 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 Epoch 00010 : val_loss improved from 0.47415 to 0.45939 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 - val_loss : 0.4594 - val_n_outputs0_loss : 0.3903 - val_n_outputs1_loss : 0.0691 Epoch 11 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 Epoch 00011 : val_loss improved from 0.45939 to 0.44304 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 - val_loss : 0.4430 - val_n_outputs0_loss : 0.3672 - val_n_outputs1_loss : 0.0758 Epoch 12 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 Epoch 00012 : val_loss improved from 0.44304 to 0.36563 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 - val_loss : 0.3656 - val_n_outputs0_loss : 0.2934 - val_n_outputs1_loss : 0.0723 Epoch 13 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 Epoch 00013 : val_loss improved from 0.36563 to 0.30773 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 - val_loss : 0.3077 - val_n_outputs0_loss : 0.2463 - val_n_outputs1_loss : 0.0614 Epoch 14 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 Epoch 00014 : val_loss improved from 0.30773 to 0.27574 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 - val_loss : 0.2757 - val_n_outputs0_loss : 0.2294 - val_n_outputs1_loss : 0.0463 Epoch 15 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 Epoch 00015 : val_loss improved from 0.27574 to 0.24205 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 - val_loss : 0.2421 - val_n_outputs0_loss : 0.1966 - val_n_outputs1_loss : 0.0454 Epoch 16 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 Epoch 00016 : val_loss did not improve from 0.24205 10 / 10 [ ============================== ] - 1 s 100 ms / step - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 - val_loss : 0.2473 - val_n_outputs0_loss : 0.2023 - val_n_outputs1_loss : 0.0450 Epoch 17 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 Epoch 00017 : val_loss improved from 0.24205 to 0.22809 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 - val_loss : 0.2281 - val_n_outputs0_loss : 0.1842 - val_n_outputs1_loss : 0.0438 Epoch 18 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 Epoch 00018 : val_loss improved from 0.22809 to 0.21671 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 - val_loss : 0.2167 - val_n_outputs0_loss : 0.1768 - val_n_outputs1_loss : 0.0400 Epoch 19 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 Epoch 00019 : val_loss did not improve from 0.21671 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 - val_loss : 0.2190 - val_n_outputs0_loss : 0.1788 - val_n_outputs1_loss : 0.0402 Epoch 20 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 Epoch 00020 : val_loss improved from 0.21671 to 0.21046 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 - val_loss : 0.2105 - val_n_outputs0_loss : 0.1718 - val_n_outputs1_loss : 0.0386 Epoch 21 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 Epoch 00021 : val_loss improved from 0.21046 to 0.20605 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 - val_loss : 0.2060 - val_n_outputs0_loss : 0.1675 - val_n_outputs1_loss : 0.0385 Epoch 22 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 Epoch 00022 : val_loss improved from 0.20605 to 0.20553 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 106 ms / step - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 - val_loss : 0.2055 - val_n_outputs0_loss : 0.1711 - val_n_outputs1_loss : 0.0344 Epoch 23 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 Epoch 00023 : val_loss improved from 0.20553 to 0.20273 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 - val_loss : 0.2027 - val_n_outputs0_loss : 0.1697 - val_n_outputs1_loss : 0.0331 Epoch 24 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 Epoch 00024 : val_loss improved from 0.20273 to 0.19049 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 - val_loss : 0.1905 - val_n_outputs0_loss : 0.1562 - val_n_outputs1_loss : 0.0343 Epoch 25 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 Epoch 00025 : val_loss improved from 0.19049 to 0.18404 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 - val_loss : 0.1840 - val_n_outputs0_loss : 0.1488 - val_n_outputs1_loss : 0.0352 Epoch 26 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 Epoch 00026 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 102 ms / step - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 - val_loss : 0.1907 - val_n_outputs0_loss : 0.1563 - val_n_outputs1_loss : 0.0344 Epoch 27 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 Epoch 00027 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 - val_loss : 0.1922 - val_n_outputs0_loss : 0.1527 - val_n_outputs1_loss : 0.0396 Epoch 28 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 Epoch 00028 : val_loss improved from 0.18404 to 0.17462 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 - val_loss : 0.1746 - val_n_outputs0_loss : 0.1436 - val_n_outputs1_loss : 0.0311 Epoch 29 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 Epoch 00029 : val_loss improved from 0.17462 to 0.17365 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 - val_loss : 0.1736 - val_n_outputs0_loss : 0.1432 - val_n_outputs1_loss : 0.0305 Epoch 30 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 Epoch 00030 : val_loss did not improve from 0.17365 10 / 10 [ ============================== ] - 1 s 96 ms / step - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 - val_loss : 0.1799 - val_n_outputs0_loss : 0.1493 - val_n_outputs1_loss : 0.0306 Epoch 31 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 Epoch 00031 : val_loss improved from 0.17365 to 0.17255 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 - val_loss : 0.1726 - val_n_outputs0_loss : 0.1383 - val_n_outputs1_loss : 0.0342 Epoch 32 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 Epoch 00032 : val_loss did not improve from 0.17255 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 - val_loss : 0.1764 - val_n_outputs0_loss : 0.1456 - val_n_outputs1_loss : 0.0308 Epoch 33 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 Epoch 00033 : val_loss improved from 0.17255 to 0.17092 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 115 ms / step - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 - val_loss : 0.1709 - val_n_outputs0_loss : 0.1395 - val_n_outputs1_loss : 0.0315 Epoch 34 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 Epoch 00034 : val_loss improved from 0.17092 to 0.16704 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 - val_loss : 0.1670 - val_n_outputs0_loss : 0.1342 - val_n_outputs1_loss : 0.0329 Epoch 35 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 Epoch 00035 : val_loss improved from 0.16704 to 0.15917 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 - val_loss : 0.1592 - val_n_outputs0_loss : 0.1280 - val_n_outputs1_loss : 0.0311 Epoch 36 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 Epoch 00036 : val_loss improved from 0.15917 to 0.15774 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 114 ms / step - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 - val_loss : 0.1577 - val_n_outputs0_loss : 0.1264 - val_n_outputs1_loss : 0.0313 Epoch 37 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 Epoch 00037 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 - val_loss : 0.1598 - val_n_outputs0_loss : 0.1281 - val_n_outputs1_loss : 0.0317 Epoch 38 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 Epoch 00038 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 - val_loss : 0.1586 - val_n_outputs0_loss : 0.1269 - val_n_outputs1_loss : 0.0317 Epoch 39 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 Epoch 00039 : val_loss improved from 0.15774 to 0.15441 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 - val_loss : 0.1544 - val_n_outputs0_loss : 0.1243 - val_n_outputs1_loss : 0.0301 Epoch 40 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 Epoch 00040 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 - val_loss : 0.1588 - val_n_outputs0_loss : 0.1275 - val_n_outputs1_loss : 0.0313 Epoch 41 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 Epoch 00041 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 - val_loss : 0.1580 - val_n_outputs0_loss : 0.1271 - val_n_outputs1_loss : 0.0308 Epoch 42 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 Epoch 00042 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 - val_loss : 0.1614 - val_n_outputs0_loss : 0.1315 - val_n_outputs1_loss : 0.0299 Epoch 43 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 Epoch 00043 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 - val_loss : 0.1587 - val_n_outputs0_loss : 0.1298 - val_n_outputs1_loss : 0.0288 Epoch 44 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 Epoch 00044 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 - val_loss : 0.1601 - val_n_outputs0_loss : 0.1304 - val_n_outputs1_loss : 0.0296 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m10 . 563 s user 1 m11 . 485 s sys 0 m39 . 110 s","title":"MSP Car 1"},{"location":"training-logs/msp-car-1/#minnesota-stem-partners-car-1-training-log","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 time donkey train -- tub =./ data / msp - car - 1 -- model =./ models / msp - car - 1. h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 18 : 57.390998 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 18 : 57.409838 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.410285 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.410424 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.411314 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.412358 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.412506 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.413323 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.413712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.415437 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.415619 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416133 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416523 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.416750 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 18 : 57.420820 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 18 : 57.421125 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cbee7970 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.421136 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 18 : 57.421270 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.421679 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.421712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.421724 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.421735 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.421746 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.421756 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.421766 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.421776 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.421840 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422285 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422675 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.422700 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.504507 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 18 : 57.504534 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 18 : 57.504541 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 18 : 57.504754 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505207 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505632 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.506019 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9892 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 18 : 57.507379 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cdd66f30 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.507389 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / msp - car - 1 / catalog_17 . catalog Records # Training 1265 Records # Validation 317 Epoch 1 / 100 2021 - 07 - 26 21 : 18 : 58.397797 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 58.705078 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 59.429125 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 18 : 59.481809 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 Epoch 00001 : val_loss improved from inf to 0.60297 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 3 s 288 ms / step - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 - val_loss : 0.6030 - val_n_outputs0_loss : 0.4514 - val_n_outputs1_loss : 0.1516 Epoch 2 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 Epoch 00002 : val_loss improved from 0.60297 to 0.51595 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 124 ms / step - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 - val_loss : 0.5160 - val_n_outputs0_loss : 0.4188 - val_n_outputs1_loss : 0.0972 Epoch 3 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 Epoch 00003 : val_loss improved from 0.51595 to 0.50280 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 - val_loss : 0.5028 - val_n_outputs0_loss : 0.4224 - val_n_outputs1_loss : 0.0804 Epoch 4 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 Epoch 00004 : val_loss improved from 0.50280 to 0.49159 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 - val_loss : 0.4916 - val_n_outputs0_loss : 0.4203 - val_n_outputs1_loss : 0.0713 Epoch 5 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 Epoch 00005 : val_loss improved from 0.49159 to 0.48784 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 - val_loss : 0.4878 - val_n_outputs0_loss : 0.4107 - val_n_outputs1_loss : 0.0772 Epoch 6 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 Epoch 00006 : val_loss improved from 0.48784 to 0.48521 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 - val_loss : 0.4852 - val_n_outputs0_loss : 0.4127 - val_n_outputs1_loss : 0.0725 Epoch 7 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 Epoch 00007 : val_loss improved from 0.48521 to 0.48270 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 - val_loss : 0.4827 - val_n_outputs0_loss : 0.4097 - val_n_outputs1_loss : 0.0730 Epoch 8 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 Epoch 00008 : val_loss improved from 0.48270 to 0.47415 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 - val_loss : 0.4741 - val_n_outputs0_loss : 0.4026 - val_n_outputs1_loss : 0.0715 Epoch 9 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 Epoch 00009 : val_loss did not improve from 0.47415 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 - val_loss : 0.4780 - val_n_outputs0_loss : 0.4069 - val_n_outputs1_loss : 0.0711 Epoch 10 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 Epoch 00010 : val_loss improved from 0.47415 to 0.45939 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 - val_loss : 0.4594 - val_n_outputs0_loss : 0.3903 - val_n_outputs1_loss : 0.0691 Epoch 11 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 Epoch 00011 : val_loss improved from 0.45939 to 0.44304 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 - val_loss : 0.4430 - val_n_outputs0_loss : 0.3672 - val_n_outputs1_loss : 0.0758 Epoch 12 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 Epoch 00012 : val_loss improved from 0.44304 to 0.36563 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 - val_loss : 0.3656 - val_n_outputs0_loss : 0.2934 - val_n_outputs1_loss : 0.0723 Epoch 13 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 Epoch 00013 : val_loss improved from 0.36563 to 0.30773 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 - val_loss : 0.3077 - val_n_outputs0_loss : 0.2463 - val_n_outputs1_loss : 0.0614 Epoch 14 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 Epoch 00014 : val_loss improved from 0.30773 to 0.27574 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 - val_loss : 0.2757 - val_n_outputs0_loss : 0.2294 - val_n_outputs1_loss : 0.0463 Epoch 15 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 Epoch 00015 : val_loss improved from 0.27574 to 0.24205 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 - val_loss : 0.2421 - val_n_outputs0_loss : 0.1966 - val_n_outputs1_loss : 0.0454 Epoch 16 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 Epoch 00016 : val_loss did not improve from 0.24205 10 / 10 [ ============================== ] - 1 s 100 ms / step - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 - val_loss : 0.2473 - val_n_outputs0_loss : 0.2023 - val_n_outputs1_loss : 0.0450 Epoch 17 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 Epoch 00017 : val_loss improved from 0.24205 to 0.22809 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 - val_loss : 0.2281 - val_n_outputs0_loss : 0.1842 - val_n_outputs1_loss : 0.0438 Epoch 18 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 Epoch 00018 : val_loss improved from 0.22809 to 0.21671 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 - val_loss : 0.2167 - val_n_outputs0_loss : 0.1768 - val_n_outputs1_loss : 0.0400 Epoch 19 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 Epoch 00019 : val_loss did not improve from 0.21671 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 - val_loss : 0.2190 - val_n_outputs0_loss : 0.1788 - val_n_outputs1_loss : 0.0402 Epoch 20 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 Epoch 00020 : val_loss improved from 0.21671 to 0.21046 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 - val_loss : 0.2105 - val_n_outputs0_loss : 0.1718 - val_n_outputs1_loss : 0.0386 Epoch 21 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 Epoch 00021 : val_loss improved from 0.21046 to 0.20605 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 - val_loss : 0.2060 - val_n_outputs0_loss : 0.1675 - val_n_outputs1_loss : 0.0385 Epoch 22 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 Epoch 00022 : val_loss improved from 0.20605 to 0.20553 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 106 ms / step - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 - val_loss : 0.2055 - val_n_outputs0_loss : 0.1711 - val_n_outputs1_loss : 0.0344 Epoch 23 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 Epoch 00023 : val_loss improved from 0.20553 to 0.20273 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 - val_loss : 0.2027 - val_n_outputs0_loss : 0.1697 - val_n_outputs1_loss : 0.0331 Epoch 24 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 Epoch 00024 : val_loss improved from 0.20273 to 0.19049 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 - val_loss : 0.1905 - val_n_outputs0_loss : 0.1562 - val_n_outputs1_loss : 0.0343 Epoch 25 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 Epoch 00025 : val_loss improved from 0.19049 to 0.18404 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 - val_loss : 0.1840 - val_n_outputs0_loss : 0.1488 - val_n_outputs1_loss : 0.0352 Epoch 26 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 Epoch 00026 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 102 ms / step - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 - val_loss : 0.1907 - val_n_outputs0_loss : 0.1563 - val_n_outputs1_loss : 0.0344 Epoch 27 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 Epoch 00027 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 - val_loss : 0.1922 - val_n_outputs0_loss : 0.1527 - val_n_outputs1_loss : 0.0396 Epoch 28 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 Epoch 00028 : val_loss improved from 0.18404 to 0.17462 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 - val_loss : 0.1746 - val_n_outputs0_loss : 0.1436 - val_n_outputs1_loss : 0.0311 Epoch 29 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 Epoch 00029 : val_loss improved from 0.17462 to 0.17365 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 - val_loss : 0.1736 - val_n_outputs0_loss : 0.1432 - val_n_outputs1_loss : 0.0305 Epoch 30 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 Epoch 00030 : val_loss did not improve from 0.17365 10 / 10 [ ============================== ] - 1 s 96 ms / step - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 - val_loss : 0.1799 - val_n_outputs0_loss : 0.1493 - val_n_outputs1_loss : 0.0306 Epoch 31 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 Epoch 00031 : val_loss improved from 0.17365 to 0.17255 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 - val_loss : 0.1726 - val_n_outputs0_loss : 0.1383 - val_n_outputs1_loss : 0.0342 Epoch 32 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 Epoch 00032 : val_loss did not improve from 0.17255 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 - val_loss : 0.1764 - val_n_outputs0_loss : 0.1456 - val_n_outputs1_loss : 0.0308 Epoch 33 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 Epoch 00033 : val_loss improved from 0.17255 to 0.17092 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 115 ms / step - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 - val_loss : 0.1709 - val_n_outputs0_loss : 0.1395 - val_n_outputs1_loss : 0.0315 Epoch 34 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 Epoch 00034 : val_loss improved from 0.17092 to 0.16704 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 - val_loss : 0.1670 - val_n_outputs0_loss : 0.1342 - val_n_outputs1_loss : 0.0329 Epoch 35 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 Epoch 00035 : val_loss improved from 0.16704 to 0.15917 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 - val_loss : 0.1592 - val_n_outputs0_loss : 0.1280 - val_n_outputs1_loss : 0.0311 Epoch 36 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 Epoch 00036 : val_loss improved from 0.15917 to 0.15774 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 114 ms / step - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 - val_loss : 0.1577 - val_n_outputs0_loss : 0.1264 - val_n_outputs1_loss : 0.0313 Epoch 37 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 Epoch 00037 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 - val_loss : 0.1598 - val_n_outputs0_loss : 0.1281 - val_n_outputs1_loss : 0.0317 Epoch 38 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 Epoch 00038 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 - val_loss : 0.1586 - val_n_outputs0_loss : 0.1269 - val_n_outputs1_loss : 0.0317 Epoch 39 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 Epoch 00039 : val_loss improved from 0.15774 to 0.15441 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 - val_loss : 0.1544 - val_n_outputs0_loss : 0.1243 - val_n_outputs1_loss : 0.0301 Epoch 40 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 Epoch 00040 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 - val_loss : 0.1588 - val_n_outputs0_loss : 0.1275 - val_n_outputs1_loss : 0.0313 Epoch 41 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 Epoch 00041 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 - val_loss : 0.1580 - val_n_outputs0_loss : 0.1271 - val_n_outputs1_loss : 0.0308 Epoch 42 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 Epoch 00042 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 - val_loss : 0.1614 - val_n_outputs0_loss : 0.1315 - val_n_outputs1_loss : 0.0299 Epoch 43 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 Epoch 00043 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 - val_loss : 0.1587 - val_n_outputs0_loss : 0.1298 - val_n_outputs1_loss : 0.0288 Epoch 44 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 Epoch 00044 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 - val_loss : 0.1601 - val_n_outputs0_loss : 0.1304 - val_n_outputs1_loss : 0.0296 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m10 . 563 s user 1 m11 . 485 s sys 0 m39 . 110 s","title":"Minnesota STEM Partners Car 1 Training Log"},{"location":"training-logs/msp-car-2/","text":"Training run for Minneapolis STEM Partners Car #2 had 15045 images wc -l ~/mycar/data/msp-car-2/*.catalog 15045 ls -1 ~/mycar/data/msp-car-2/images | wc -l 15045 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 ( donkey ) arl@arl1:~/mycar$ donkey train --tub = ./data/msp-car-2 --model = ./models/msp-car-2.h5 ________ ______ _________ ___ __ \\_ ______________ /___________ __ __ ____/_____ ________ __ / / / __ \\_ __ \\_ //_/ _ \\_ / / / _ / _ __ ` /_ ___/ _ /_/ // /_/ / / / / ,< / __/ /_/ / / /___ / /_/ /_ / /_____/ \\_ ___//_/ /_//_/ | _ | \\_ __/_ \\_ _, / \\_ ___/ \\_ _,_/ /_/ /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021 -07-26 20 :22:54.320076: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcuda.so.1 2021 -07-26 20 :22:54.338339: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.338783: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.338925: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.339823: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.340834: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.340981: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.341775: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.342170: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.343898: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.344043: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344546: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.345163: I tensorflow/core/platform/cpu_feature_guard.cc:143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021 -07-26 20 :22:54.349277: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102 ] CPU Frequency: 3592950000 Hz 2021 -07-26 20 :22:54.349572: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e341a9f0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.349585: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : Host, Default Version 2021 -07-26 20 :22:54.349717: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350124: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.350160: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.350171: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.350180: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.350191: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.350200: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.350210: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.350220: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.350282: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350723: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.351106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.351127: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.423106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102 ] Device interconnect StreamExecutor with strength 1 edge matrix: 2021 -07-26 20 :22:54.423133: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108 ] 0 2021 -07-26 20 :22:54.423138: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121 ] 0 : N 2021 -07-26 20 :22:54.423354: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.423819: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424248: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247 ] Created TensorFlow device ( /job:localhost/replica:0/task:0/device:GPU:0 with 9890 MB memory ) -> physical GPU ( device: 0 , name: NVIDIA GeForce RTX 2080 Ti, pci bus id: 0000 :09:00.0, compute capability: 7 .5 ) 2021 -07-26 20 :22:54.425999: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e52b18b0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.426009: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : NVIDIA GeForce RTX 2080 Ti, Compute Capability 7 .5 Model: \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None, 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None, 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None, 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None, 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None, 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None, 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None, 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None, 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None, 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None, 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None, 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None, 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None, 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None, 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None, 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None, 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params: 2 ,973,828 Trainable params: 2 ,973,828 Non-trainable params: 0 __________________________________________________________________________________________________ None Using catalog /home/arl/mycar/data/msp-car-2/catalog_22.catalog Records # Training 11696 Records # Validation 2924 Epoch 1 /100 2021 -07-26 20 :22:55.471623: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:55.802565: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:56.515413: W tensorflow/stream_executor/gpu/asm_compiler.cc:116 ] *** WARNING *** You are using ptxas 9 .1.108, which is older than 9 .2.88. ptxas 9 .x before 9 .2.88 is known to miscompile XLA code, leading to incorrect results or invalid-address errors. You do not need to update to CUDA 9 .2.88 ; cherry-picking the ptxas binary is sufficient. 2021 -07-26 20 :22:56.559204: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314 ] Internal: ptxas exited with non-zero error code 65280 , output: ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation. Modify $PATH to customize ptxas location. This message will be only logged once. 92 /92 [==============================] - ETA: 0s - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 Epoch 00001 : val_loss improved from inf to 0 .59133, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 29s 310ms/step - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 - val_loss: 0 .5913 - val_n_outputs0_loss: 0 .3121 - val_n_outputs1_loss: 0 .2793 Epoch 2 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 Epoch 00002 : val_loss improved from 0 .59133 to 0 .39368, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 - val_loss: 0 .3937 - val_n_outputs0_loss: 0 .2108 - val_n_outputs1_loss: 0 .1828 Epoch 3 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 Epoch 00003 : val_loss improved from 0 .39368 to 0 .34087, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 - val_loss: 0 .3409 - val_n_outputs0_loss: 0 .1923 - val_n_outputs1_loss: 0 .1486 Epoch 4 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 Epoch 00004 : val_loss improved from 0 .34087 to 0 .30588, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 119ms/step - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 - val_loss: 0 .3059 - val_n_outputs0_loss: 0 .1771 - val_n_outputs1_loss: 0 .1288 Epoch 5 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 Epoch 00005 : val_loss improved from 0 .30588 to 0 .28650, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 113ms/step - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 - val_loss: 0 .2865 - val_n_outputs0_loss: 0 .1722 - val_n_outputs1_loss: 0 .1143 Epoch 6 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 Epoch 00006 : val_loss improved from 0 .28650 to 0 .26754, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 - val_loss: 0 .2675 - val_n_outputs0_loss: 0 .1623 - val_n_outputs1_loss: 0 .1053 Epoch 7 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 Epoch 00007 : val_loss improved from 0 .26754 to 0 .25034, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 - val_loss: 0 .2503 - val_n_outputs0_loss: 0 .1551 - val_n_outputs1_loss: 0 .0952 Epoch 8 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 Epoch 00008 : val_loss improved from 0 .25034 to 0 .24291, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 - val_loss: 0 .2429 - val_n_outputs0_loss: 0 .1524 - val_n_outputs1_loss: 0 .0905 Epoch 9 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 Epoch 00009 : val_loss improved from 0 .24291 to 0 .22718, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 - val_loss: 0 .2272 - val_n_outputs0_loss: 0 .1450 - val_n_outputs1_loss: 0 .0821 Epoch 10 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 Epoch 00010 : val_loss did not improve from 0 .22718 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 - val_loss: 0 .2305 - val_n_outputs0_loss: 0 .1471 - val_n_outputs1_loss: 0 .0834 Epoch 11 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 Epoch 00011 : val_loss improved from 0 .22718 to 0 .21581, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 - val_loss: 0 .2158 - val_n_outputs0_loss: 0 .1375 - val_n_outputs1_loss: 0 .0783 Epoch 12 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 Epoch 00012 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 - val_loss: 0 .2185 - val_n_outputs0_loss: 0 .1382 - val_n_outputs1_loss: 0 .0802 Epoch 13 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 Epoch 00013 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 - val_loss: 0 .2198 - val_n_outputs0_loss: 0 .1394 - val_n_outputs1_loss: 0 .0804 Epoch 14 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 Epoch 00014 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 - val_loss: 0 .2167 - val_n_outputs0_loss: 0 .1389 - val_n_outputs1_loss: 0 .0778 Epoch 15 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 Epoch 00015 : val_loss improved from 0 .21581 to 0 .20899, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 - val_loss: 0 .2090 - val_n_outputs0_loss: 0 .1345 - val_n_outputs1_loss: 0 .0745 Epoch 16 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 Epoch 00016 : val_loss did not improve from 0 .20899 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 - val_loss: 0 .2097 - val_n_outputs0_loss: 0 .1348 - val_n_outputs1_loss: 0 .0748 Epoch 17 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 Epoch 00017 : val_loss improved from 0 .20899 to 0 .20324, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 - val_loss: 0 .2032 - val_n_outputs0_loss: 0 .1329 - val_n_outputs1_loss: 0 .0703 Epoch 18 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 Epoch 00018 : val_loss improved from 0 .20324 to 0 .19965, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 - val_loss: 0 .1997 - val_n_outputs0_loss: 0 .1309 - val_n_outputs1_loss: 0 .0688 Epoch 19 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 Epoch 00019 : val_loss improved from 0 .19965 to 0 .19877, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 - val_loss: 0 .1988 - val_n_outputs0_loss: 0 .1294 - val_n_outputs1_loss: 0 .0694 Epoch 20 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 Epoch 00020 : val_loss did not improve from 0 .19877 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 - val_loss: 0 .2004 - val_n_outputs0_loss: 0 .1312 - val_n_outputs1_loss: 0 .0692 Epoch 21 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 Epoch 00021 : val_loss improved from 0 .19877 to 0 .19564, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 - val_loss: 0 .1956 - val_n_outputs0_loss: 0 .1252 - val_n_outputs1_loss: 0 .0704 Epoch 22 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 Epoch 00022 : val_loss improved from 0 .19564 to 0 .19422, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 - val_loss: 0 .1942 - val_n_outputs0_loss: 0 .1259 - val_n_outputs1_loss: 0 .0683 Epoch 23 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 Epoch 00023 : val_loss improved from 0 .19422 to 0 .19270, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 - val_loss: 0 .1927 - val_n_outputs0_loss: 0 .1245 - val_n_outputs1_loss: 0 .0682 Epoch 24 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 Epoch 00024 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 - val_loss: 0 .1969 - val_n_outputs0_loss: 0 .1283 - val_n_outputs1_loss: 0 .0686 Epoch 25 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 Epoch 00025 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 - val_loss: 0 .1990 - val_n_outputs0_loss: 0 .1284 - val_n_outputs1_loss: 0 .0706 Epoch 26 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 Epoch 00026 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 - val_loss: 0 .1929 - val_n_outputs0_loss: 0 .1250 - val_n_outputs1_loss: 0 .0678 Epoch 27 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 Epoch 00027 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 - val_loss: 0 .1937 - val_n_outputs0_loss: 0 .1269 - val_n_outputs1_loss: 0 .0668 Epoch 28 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 Epoch 00028 : val_loss improved from 0 .19270 to 0 .19161, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 - val_loss: 0 .1916 - val_n_outputs0_loss: 0 .1230 - val_n_outputs1_loss: 0 .0686 Epoch 29 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 Epoch 00029 : val_loss improved from 0 .19161 to 0 .18655, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 - val_loss: 0 .1865 - val_n_outputs0_loss: 0 .1216 - val_n_outputs1_loss: 0 .0650 Epoch 30 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 Epoch 00030 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 109ms/step - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 - val_loss: 0 .1936 - val_n_outputs0_loss: 0 .1240 - val_n_outputs1_loss: 0 .0696 Epoch 31 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 Epoch 00031 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 - val_loss: 0 .1889 - val_n_outputs0_loss: 0 .1222 - val_n_outputs1_loss: 0 .0667 Epoch 32 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 Epoch 00032 : val_loss improved from 0 .18655 to 0 .18343, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 - val_loss: 0 .1834 - val_n_outputs0_loss: 0 .1206 - val_n_outputs1_loss: 0 .0629 Epoch 33 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 Epoch 00033 : val_loss did not improve from 0 .18343 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 - val_loss: 0 .1843 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0652 Epoch 34 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 Epoch 00034 : val_loss improved from 0 .18343 to 0 .18117, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 - val_loss: 0 .1812 - val_n_outputs0_loss: 0 .1166 - val_n_outputs1_loss: 0 .0646 Epoch 35 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 Epoch 00035 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 - val_loss: 0 .1835 - val_n_outputs0_loss: 0 .1177 - val_n_outputs1_loss: 0 .0657 Epoch 36 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 Epoch 00036 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 111ms/step - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 - val_loss: 0 .1838 - val_n_outputs0_loss: 0 .1198 - val_n_outputs1_loss: 0 .0641 Epoch 37 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 Epoch 00037 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 109ms/step - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 - val_loss: 0 .1830 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0639 Epoch 38 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 Epoch 00038 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 - val_loss: 0 .1845 - val_n_outputs0_loss: 0 .1185 - val_n_outputs1_loss: 0 .0660 Epoch 39 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 Epoch 00039 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 - val_loss: 0 .1818 - val_n_outputs0_loss: 0 .1186 - val_n_outputs1_loss: 0 .0632 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff ( donkey ) arl@arl1:~/mycar$ Checking the models 1 ls -l models/* returns 1 2 3 4 5 6 7 8 9 10 ls -l models/* -rw-r--r-- 1 arl arl 32317 Jul 26 20:30 models/database.json -rw-r--r-- 1 arl arl 35773936 Jul 26 20:17 models/msp-car-1-gpu.h5 -rw-r--r-- 1 arl arl 27506 Jul 26 20:17 models/msp-car-1-gpu.png -rw-r--r-- 1 arl arl 23659 Jul 26 19:57 models/msp-car-1.png -rw-r--r-- 1 arl arl 35773936 Jul 26 20:29 models/msp-car-2.h5 -rw-r--r-- 1 arl arl 25670 Jul 26 20:30 models/msp-car-2.png -rw-r--r-- 1 arl arl 22616 Feb 2 2020 models/mypilot.h5_loss_acc_0.040245.png -rw-r--r-- 1 arl arl 26687 Feb 2 2020 models/mypilot.h5_loss_acc_0.042222.png -rw-r--r-- 1 arl arl 11939744 Feb 2 2020 models/ref-model.h5","title":"MSP Car 2"},{"location":"training-logs/msp-car-2/#training-run-for-minneapolis-stem-partners","text":"Car #2 had 15045 images wc -l ~/mycar/data/msp-car-2/*.catalog 15045","title":"Training run for Minneapolis STEM Partners"},{"location":"training-logs/msp-car-2/#ls-1-mycardatamsp-car-2images-wc-l","text":"15045 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 ( donkey ) arl@arl1:~/mycar$ donkey train --tub = ./data/msp-car-2 --model = ./models/msp-car-2.h5 ________ ______ _________ ___ __ \\_ ______________ /___________ __ __ ____/_____ ________ __ / / / __ \\_ __ \\_ //_/ _ \\_ / / / _ / _ __ ` /_ ___/ _ /_/ // /_/ / / / / ,< / __/ /_/ / / /___ / /_/ /_ / /_____/ \\_ ___//_/ /_//_/ | _ | \\_ __/_ \\_ _, / \\_ ___/ \\_ _,_/ /_/ /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021 -07-26 20 :22:54.320076: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcuda.so.1 2021 -07-26 20 :22:54.338339: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.338783: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.338925: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.339823: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.340834: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.340981: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.341775: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.342170: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.343898: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.344043: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344546: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.345163: I tensorflow/core/platform/cpu_feature_guard.cc:143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021 -07-26 20 :22:54.349277: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102 ] CPU Frequency: 3592950000 Hz 2021 -07-26 20 :22:54.349572: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e341a9f0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.349585: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : Host, Default Version 2021 -07-26 20 :22:54.349717: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350124: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.350160: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.350171: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.350180: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.350191: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.350200: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.350210: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.350220: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.350282: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350723: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.351106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.351127: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.423106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102 ] Device interconnect StreamExecutor with strength 1 edge matrix: 2021 -07-26 20 :22:54.423133: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108 ] 0 2021 -07-26 20 :22:54.423138: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121 ] 0 : N 2021 -07-26 20 :22:54.423354: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.423819: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424248: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247 ] Created TensorFlow device ( /job:localhost/replica:0/task:0/device:GPU:0 with 9890 MB memory ) -> physical GPU ( device: 0 , name: NVIDIA GeForce RTX 2080 Ti, pci bus id: 0000 :09:00.0, compute capability: 7 .5 ) 2021 -07-26 20 :22:54.425999: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e52b18b0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.426009: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : NVIDIA GeForce RTX 2080 Ti, Compute Capability 7 .5 Model: \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None, 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None, 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None, 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None, 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None, 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None, 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None, 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None, 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None, 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None, 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None, 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None, 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None, 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None, 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None, 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None, 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params: 2 ,973,828 Trainable params: 2 ,973,828 Non-trainable params: 0 __________________________________________________________________________________________________ None Using catalog /home/arl/mycar/data/msp-car-2/catalog_22.catalog Records # Training 11696 Records # Validation 2924 Epoch 1 /100 2021 -07-26 20 :22:55.471623: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:55.802565: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:56.515413: W tensorflow/stream_executor/gpu/asm_compiler.cc:116 ] *** WARNING *** You are using ptxas 9 .1.108, which is older than 9 .2.88. ptxas 9 .x before 9 .2.88 is known to miscompile XLA code, leading to incorrect results or invalid-address errors. You do not need to update to CUDA 9 .2.88 ; cherry-picking the ptxas binary is sufficient. 2021 -07-26 20 :22:56.559204: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314 ] Internal: ptxas exited with non-zero error code 65280 , output: ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation. Modify $PATH to customize ptxas location. This message will be only logged once. 92 /92 [==============================] - ETA: 0s - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 Epoch 00001 : val_loss improved from inf to 0 .59133, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 29s 310ms/step - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 - val_loss: 0 .5913 - val_n_outputs0_loss: 0 .3121 - val_n_outputs1_loss: 0 .2793 Epoch 2 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 Epoch 00002 : val_loss improved from 0 .59133 to 0 .39368, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 - val_loss: 0 .3937 - val_n_outputs0_loss: 0 .2108 - val_n_outputs1_loss: 0 .1828 Epoch 3 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 Epoch 00003 : val_loss improved from 0 .39368 to 0 .34087, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 - val_loss: 0 .3409 - val_n_outputs0_loss: 0 .1923 - val_n_outputs1_loss: 0 .1486 Epoch 4 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 Epoch 00004 : val_loss improved from 0 .34087 to 0 .30588, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 119ms/step - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 - val_loss: 0 .3059 - val_n_outputs0_loss: 0 .1771 - val_n_outputs1_loss: 0 .1288 Epoch 5 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 Epoch 00005 : val_loss improved from 0 .30588 to 0 .28650, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 113ms/step - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 - val_loss: 0 .2865 - val_n_outputs0_loss: 0 .1722 - val_n_outputs1_loss: 0 .1143 Epoch 6 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 Epoch 00006 : val_loss improved from 0 .28650 to 0 .26754, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 - val_loss: 0 .2675 - val_n_outputs0_loss: 0 .1623 - val_n_outputs1_loss: 0 .1053 Epoch 7 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 Epoch 00007 : val_loss improved from 0 .26754 to 0 .25034, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 - val_loss: 0 .2503 - val_n_outputs0_loss: 0 .1551 - val_n_outputs1_loss: 0 .0952 Epoch 8 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 Epoch 00008 : val_loss improved from 0 .25034 to 0 .24291, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 - val_loss: 0 .2429 - val_n_outputs0_loss: 0 .1524 - val_n_outputs1_loss: 0 .0905 Epoch 9 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 Epoch 00009 : val_loss improved from 0 .24291 to 0 .22718, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 - val_loss: 0 .2272 - val_n_outputs0_loss: 0 .1450 - val_n_outputs1_loss: 0 .0821 Epoch 10 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 Epoch 00010 : val_loss did not improve from 0 .22718 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 - val_loss: 0 .2305 - val_n_outputs0_loss: 0 .1471 - val_n_outputs1_loss: 0 .0834 Epoch 11 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 Epoch 00011 : val_loss improved from 0 .22718 to 0 .21581, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 - val_loss: 0 .2158 - val_n_outputs0_loss: 0 .1375 - val_n_outputs1_loss: 0 .0783 Epoch 12 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 Epoch 00012 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 - val_loss: 0 .2185 - val_n_outputs0_loss: 0 .1382 - val_n_outputs1_loss: 0 .0802 Epoch 13 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 Epoch 00013 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 - val_loss: 0 .2198 - val_n_outputs0_loss: 0 .1394 - val_n_outputs1_loss: 0 .0804 Epoch 14 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 Epoch 00014 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 - val_loss: 0 .2167 - val_n_outputs0_loss: 0 .1389 - val_n_outputs1_loss: 0 .0778 Epoch 15 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 Epoch 00015 : val_loss improved from 0 .21581 to 0 .20899, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 - val_loss: 0 .2090 - val_n_outputs0_loss: 0 .1345 - val_n_outputs1_loss: 0 .0745 Epoch 16 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 Epoch 00016 : val_loss did not improve from 0 .20899 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 - val_loss: 0 .2097 - val_n_outputs0_loss: 0 .1348 - val_n_outputs1_loss: 0 .0748 Epoch 17 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 Epoch 00017 : val_loss improved from 0 .20899 to 0 .20324, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 - val_loss: 0 .2032 - val_n_outputs0_loss: 0 .1329 - val_n_outputs1_loss: 0 .0703 Epoch 18 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 Epoch 00018 : val_loss improved from 0 .20324 to 0 .19965, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 - val_loss: 0 .1997 - val_n_outputs0_loss: 0 .1309 - val_n_outputs1_loss: 0 .0688 Epoch 19 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 Epoch 00019 : val_loss improved from 0 .19965 to 0 .19877, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 - val_loss: 0 .1988 - val_n_outputs0_loss: 0 .1294 - val_n_outputs1_loss: 0 .0694 Epoch 20 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 Epoch 00020 : val_loss did not improve from 0 .19877 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 - val_loss: 0 .2004 - val_n_outputs0_loss: 0 .1312 - val_n_outputs1_loss: 0 .0692 Epoch 21 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 Epoch 00021 : val_loss improved from 0 .19877 to 0 .19564, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 - val_loss: 0 .1956 - val_n_outputs0_loss: 0 .1252 - val_n_outputs1_loss: 0 .0704 Epoch 22 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 Epoch 00022 : val_loss improved from 0 .19564 to 0 .19422, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 - val_loss: 0 .1942 - val_n_outputs0_loss: 0 .1259 - val_n_outputs1_loss: 0 .0683 Epoch 23 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 Epoch 00023 : val_loss improved from 0 .19422 to 0 .19270, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 - val_loss: 0 .1927 - val_n_outputs0_loss: 0 .1245 - val_n_outputs1_loss: 0 .0682 Epoch 24 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 Epoch 00024 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 - val_loss: 0 .1969 - val_n_outputs0_loss: 0 .1283 - val_n_outputs1_loss: 0 .0686 Epoch 25 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 Epoch 00025 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 - val_loss: 0 .1990 - val_n_outputs0_loss: 0 .1284 - val_n_outputs1_loss: 0 .0706 Epoch 26 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 Epoch 00026 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 - val_loss: 0 .1929 - val_n_outputs0_loss: 0 .1250 - val_n_outputs1_loss: 0 .0678 Epoch 27 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 Epoch 00027 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 - val_loss: 0 .1937 - val_n_outputs0_loss: 0 .1269 - val_n_outputs1_loss: 0 .0668 Epoch 28 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 Epoch 00028 : val_loss improved from 0 .19270 to 0 .19161, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 - val_loss: 0 .1916 - val_n_outputs0_loss: 0 .1230 - val_n_outputs1_loss: 0 .0686 Epoch 29 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 Epoch 00029 : val_loss improved from 0 .19161 to 0 .18655, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 - val_loss: 0 .1865 - val_n_outputs0_loss: 0 .1216 - val_n_outputs1_loss: 0 .0650 Epoch 30 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 Epoch 00030 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 109ms/step - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 - val_loss: 0 .1936 - val_n_outputs0_loss: 0 .1240 - val_n_outputs1_loss: 0 .0696 Epoch 31 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 Epoch 00031 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 - val_loss: 0 .1889 - val_n_outputs0_loss: 0 .1222 - val_n_outputs1_loss: 0 .0667 Epoch 32 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 Epoch 00032 : val_loss improved from 0 .18655 to 0 .18343, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 - val_loss: 0 .1834 - val_n_outputs0_loss: 0 .1206 - val_n_outputs1_loss: 0 .0629 Epoch 33 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 Epoch 00033 : val_loss did not improve from 0 .18343 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 - val_loss: 0 .1843 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0652 Epoch 34 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 Epoch 00034 : val_loss improved from 0 .18343 to 0 .18117, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 - val_loss: 0 .1812 - val_n_outputs0_loss: 0 .1166 - val_n_outputs1_loss: 0 .0646 Epoch 35 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 Epoch 00035 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 - val_loss: 0 .1835 - val_n_outputs0_loss: 0 .1177 - val_n_outputs1_loss: 0 .0657 Epoch 36 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 Epoch 00036 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 111ms/step - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 - val_loss: 0 .1838 - val_n_outputs0_loss: 0 .1198 - val_n_outputs1_loss: 0 .0641 Epoch 37 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 Epoch 00037 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 109ms/step - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 - val_loss: 0 .1830 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0639 Epoch 38 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 Epoch 00038 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 - val_loss: 0 .1845 - val_n_outputs0_loss: 0 .1185 - val_n_outputs1_loss: 0 .0660 Epoch 39 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 Epoch 00039 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 - val_loss: 0 .1818 - val_n_outputs0_loss: 0 .1186 - val_n_outputs1_loss: 0 .0632 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff ( donkey ) arl@arl1:~/mycar$","title":"ls -1 ~/mycar/data/msp-car-2/images | wc -l"},{"location":"training-logs/msp-car-2/#checking-the-models","text":"1 ls -l models/* returns 1 2 3 4 5 6 7 8 9 10 ls -l models/* -rw-r--r-- 1 arl arl 32317 Jul 26 20:30 models/database.json -rw-r--r-- 1 arl arl 35773936 Jul 26 20:17 models/msp-car-1-gpu.h5 -rw-r--r-- 1 arl arl 27506 Jul 26 20:17 models/msp-car-1-gpu.png -rw-r--r-- 1 arl arl 23659 Jul 26 19:57 models/msp-car-1.png -rw-r--r-- 1 arl arl 35773936 Jul 26 20:29 models/msp-car-2.h5 -rw-r--r-- 1 arl arl 25670 Jul 26 20:30 models/msp-car-2.png -rw-r--r-- 1 arl arl 22616 Feb 2 2020 models/mypilot.h5_loss_acc_0.040245.png -rw-r--r-- 1 arl arl 26687 Feb 2 2020 models/mypilot.h5_loss_acc_0.042222.png -rw-r--r-- 1 arl arl 11939744 Feb 2 2020 models/ref-model.h5","title":"Checking the models"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to the AI Racing League Promoting equity and innovation in AI education. The AI Racing League is a fun way to learn the concepts behind artificial intelligence! We learn AI by teaching small remote-controlled (RC) cars to drive around a track autonomously. The cars use a low-cost Raspberry Pi computer (or NVIDIA Nano) with a camera. Students drive around the track and gather a set of images to \"train\" a neural network that can be used to automatically steer the car. In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide variety of lesson plans from 5th-grade up to college-level participants. Our secret sauce is to combine the right hardware, software, mentors and a flexible learning curriculum to create fun events that students love to participate in. Current Status We are in the process of restarting our events starting in the fall of 2023. Please contact Dan McCreary if you would like to participate. The following organizations have expressed an interest in helping out: Code Savvy - Contact: Valarie Lockhart - The AI Racing League runs as a project under Code Savvy. They are a 503C not-for-profit organization. Minneanalytics - Contact: Dan Atkins - contact Dan Atkins directly if you are looking for funding for your team. Washburn High School - Contact: Peter Grul Best Buy Education - Contact: Wes Strait - Wes and his team have run several events using the Amazon deep racer. Minnesota STEM Partnership - Contact: Michael Wulf - Michael created his first AI Racing League team in the summer of 2021. Create Minneapolis Contacts: Krista Stommes and Rob Mission The mission of the AI Racing League is to create and deliver educational materials that will make fun AI training accessible to everyone. We place a special focus on students from disadvantaged communities including women and minorities. We work as a sub-project of the CodeSavvy not-for-profit organization and we adhere to their guidelines for the quality and security of our students. This means that all our volunteers have background checks and we limit the student-to-mentor ratios to no more than three students per mentor. We are committed to equal-opportunity mentoring. We strive to recruit, train and retain the best mentors we can find. We are inspired by the values behind the CoderDojo mentoring system and their innovative use of flexible concept cards . We attempt to publish concept cards that provide a flexible and agile training environment for a wide variety of learners. We believe strongly in student-led initiatives and project-based learning. We feel students learn the most when they are building things together in teams. We believe our curriculum should be broad to support a wide variety of students from begging Python to advanced AI. Rather than force students down a single path of learning, we believe our instructors should be more like travel guides to help students explore their areas of interest. Our curriculum needs to adapt to single-hour events up to multi-year mentoring. See Rhizomatic Learning for what inspires us. Checkout Our Other Sites: AI Racing League Beginning Python [MBOT] MicroPython for Kids ChatGPT for Teachers AI for Kids MBOT IoT Hackday - costume contest Other Resources Education Material: If you would like to teach AI Racing in the classroom, at a meetup or even in a corporation check out our resources here Resources: Want to connect or contribute to the community check us out here About us: Want to know more about us? Check us out","title":"Home"},{"location":"#welcome-to-the-ai-racing-league","text":"Promoting equity and innovation in AI education. The AI Racing League is a fun way to learn the concepts behind artificial intelligence! We learn AI by teaching small remote-controlled (RC) cars to drive around a track autonomously. The cars use a low-cost Raspberry Pi computer (or NVIDIA Nano) with a camera. Students drive around the track and gather a set of images to \"train\" a neural network that can be used to automatically steer the car. In addition to teaching machine learning, this course also teaches concepts like Python programming, computer vision, data science and generative AI. Our curriculum is inspired by the DonkeyCar and the CoderDojo mentoring system. We feature a wide variety of lesson plans from 5th-grade up to college-level participants. Our secret sauce is to combine the right hardware, software, mentors and a flexible learning curriculum to create fun events that students love to participate in.","title":"Welcome to the AI Racing League"},{"location":"#current-status","text":"We are in the process of restarting our events starting in the fall of 2023. Please contact Dan McCreary if you would like to participate. The following organizations have expressed an interest in helping out: Code Savvy - Contact: Valarie Lockhart - The AI Racing League runs as a project under Code Savvy. They are a 503C not-for-profit organization. Minneanalytics - Contact: Dan Atkins - contact Dan Atkins directly if you are looking for funding for your team. Washburn High School - Contact: Peter Grul Best Buy Education - Contact: Wes Strait - Wes and his team have run several events using the Amazon deep racer. Minnesota STEM Partnership - Contact: Michael Wulf - Michael created his first AI Racing League team in the summer of 2021. Create Minneapolis Contacts: Krista Stommes and Rob","title":"Current Status"},{"location":"#mission","text":"The mission of the AI Racing League is to create and deliver educational materials that will make fun AI training accessible to everyone. We place a special focus on students from disadvantaged communities including women and minorities. We work as a sub-project of the CodeSavvy not-for-profit organization and we adhere to their guidelines for the quality and security of our students. This means that all our volunteers have background checks and we limit the student-to-mentor ratios to no more than three students per mentor. We are committed to equal-opportunity mentoring. We strive to recruit, train and retain the best mentors we can find. We are inspired by the values behind the CoderDojo mentoring system and their innovative use of flexible concept cards . We attempt to publish concept cards that provide a flexible and agile training environment for a wide variety of learners. We believe strongly in student-led initiatives and project-based learning. We feel students learn the most when they are building things together in teams. We believe our curriculum should be broad to support a wide variety of students from begging Python to advanced AI. Rather than force students down a single path of learning, we believe our instructors should be more like travel guides to help students explore their areas of interest. Our curriculum needs to adapt to single-hour events up to multi-year mentoring. See Rhizomatic Learning for what inspires us.","title":"Mission"},{"location":"#checkout-our-other-sites","text":"AI Racing League Beginning Python [MBOT] MicroPython for Kids ChatGPT for Teachers AI for Kids MBOT IoT Hackday - costume contest","title":"Checkout Our Other Sites:"},{"location":"#other-resources","text":"Education Material: If you would like to teach AI Racing in the classroom, at a meetup or even in a corporation check out our resources here Resources: Want to connect or contribute to the community check us out here About us: Want to know more about us? Check us out","title":"Other Resources"},{"location":"about/","text":"About the AI Racing League DIY Robocars and the Donkey Cars are the community that kick-started the AI Racing League into existence by hosting self-driving races. There are now several meetups around the country. See DIY Robocars Website to learn about events, classes, tips, projects, and instructions to build other types of cars. Checkout the Official Donkey Car Site https://www.donkeycar.com/ Coder Dojo A community of over 2,300 free, open and local programming clubs for young people 58,000 young people are being creative with technology with the help of 12,000 volunteers in 94 countries Visit https://coderdojo.com Code Savvy Code Savvy strives to make kids and teens more code-savvy through creative educational programs and services. We incubate and support community-based programs that bring technology and know-how to local kids and educators, all the while championing gender and ethnic diversity. Code Savvy is dedicated to ensuring the next generation of computer science professionals represents the billions of users of tomorrow\u2019s innovative technologies. Visit https://codesavvy.org Licensing Like all CoderDojo-created content, you are free to use this content in K-12 noncommercial educational settings for teaching without paying license fees. We also encourage our community to create variations and help us enlarge the curriculum. We always appreciate attribution! Details of the license terms are here: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)","title":"About at ARL"},{"location":"about/#about-the-ai-racing-league","text":"DIY Robocars and the Donkey Cars are the community that kick-started the AI Racing League into existence by hosting self-driving races. There are now several meetups around the country. See DIY Robocars Website to learn about events, classes, tips, projects, and instructions to build other types of cars. Checkout the Official Donkey Car Site https://www.donkeycar.com/","title":"About the AI Racing League"},{"location":"about/#coder-dojo","text":"A community of over 2,300 free, open and local programming clubs for young people 58,000 young people are being creative with technology with the help of 12,000 volunteers in 94 countries Visit https://coderdojo.com","title":"Coder Dojo"},{"location":"about/#code-savvy","text":"Code Savvy strives to make kids and teens more code-savvy through creative educational programs and services. We incubate and support community-based programs that bring technology and know-how to local kids and educators, all the while championing gender and ethnic diversity. Code Savvy is dedicated to ensuring the next generation of computer science professionals represents the billions of users of tomorrow\u2019s innovative technologies. Visit https://codesavvy.org","title":"Code Savvy"},{"location":"about/#licensing","text":"Like all CoderDojo-created content, you are free to use this content in K-12 noncommercial educational settings for teaching without paying license fees. We also encourage our community to create variations and help us enlarge the curriculum. We always appreciate attribution! Details of the license terms are here: Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)","title":"Licensing"},{"location":"business-plan-2020/","text":"AI Racing League Business Plan for 2020 Summary This business plan governs the AI Racing League for the calendar year 2020. We are operating as a project within CodeSavvy. CodeSavvy is a register 501C organization. CodeSavvy's mission is to promote coding skills in youth with a focus on promoting mentoring and training for girls and disavantaged youth. Brief History The AI Racing League was founded in the summary of 2019. We were inspired by the viral global DonkeyCar project. We wondered if the DonkeyCar racing events could be used to teach AI in the classroom. The goals of the founders were to promote fun events that taught AI to girls and disavantaged youth. We recieved an initial round of $9K in funding from the Optum Technology Social Responsibility and lauched our first event in August of 2019. This event was done at the International School of Minnesota and attracted members from the AI Research community, schools, educators and students. Since August we have participated in over a dozen events promoting AI instruction. We have trained and initial set of approximatly 50 mentors that are familair with the use of the DonkeyCar Status as of January 2020 Inventory of Assets 2 GPU Servers 10 DonkeyCars AI Racing League Web Site AI Racing League Concept Cards AI Racing League Concept Dependancy Graph Documented best practices (Lessons learned, SD image inventory etc.) Miscellenous training material Marketing materials including testimonials Post on social media Goals for 2020 Financial Goals","title":"Business Plan"},{"location":"business-plan-2020/#ai-racing-league-business-plan-for-2020","text":"","title":"AI Racing League Business Plan for 2020"},{"location":"business-plan-2020/#summary","text":"This business plan governs the AI Racing League for the calendar year 2020. We are operating as a project within CodeSavvy. CodeSavvy is a register 501C organization. CodeSavvy's mission is to promote coding skills in youth with a focus on promoting mentoring and training for girls and disavantaged youth.","title":"Summary"},{"location":"business-plan-2020/#brief-history","text":"The AI Racing League was founded in the summary of 2019. We were inspired by the viral global DonkeyCar project. We wondered if the DonkeyCar racing events could be used to teach AI in the classroom. The goals of the founders were to promote fun events that taught AI to girls and disavantaged youth. We recieved an initial round of $9K in funding from the Optum Technology Social Responsibility and lauched our first event in August of 2019. This event was done at the International School of Minnesota and attracted members from the AI Research community, schools, educators and students. Since August we have participated in over a dozen events promoting AI instruction. We have trained and initial set of approximatly 50 mentors that are familair with the use of the DonkeyCar","title":"Brief History"},{"location":"business-plan-2020/#status-as-of-january-2020","text":"","title":"Status as of January 2020"},{"location":"business-plan-2020/#inventory-of-assets","text":"2 GPU Servers 10 DonkeyCars AI Racing League Web Site AI Racing League Concept Cards AI Racing League Concept Dependancy Graph Documented best practices (Lessons learned, SD image inventory etc.) Miscellenous training material Marketing materials including testimonials Post on social media","title":"Inventory of Assets"},{"location":"business-plan-2020/#goals-for-2020","text":"","title":"Goals for 2020"},{"location":"business-plan-2020/#financial-goals","text":"","title":"Financial Goals"},{"location":"command-line-tips/","text":"Command Line Tips Get Setup 1 2 3 git config --global user.name \"Joe Smith\" git config --global user.email \"Joe.Smith123@gmail.com\" git config --global credential.helper store Raspberry Pi Command Line Tips From Terminal, you can open the current directory in the File Manager using the xdg-open command. This is similar to the Mac open command. 1 $ xdg-open . See If the PWM Board Is Working 1 i2cdetect -l This should return 1 i2c -1 i2c bcm2835 ( i2c @7e804000 ) I2C adapter 1 i2cdetect -y 1 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- Note that the line 40 and 70 has values under column 0 (I2C bus 1) If you unplug the data you should get: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- SD Card Speed Test Home -> Accessories -> Raspberry Pi Diagnostics 1 2 3 4 5 6 7 8 9 10 11 12 13 Raspberry Pi Diagnostics - version 0 . 9 Sat Jul 3 14 : 25 : 23 2021 Test : SD Card Speed Test Run 1 prepare-file ; 0 ; 0 ; 20628 ; 40 seq-write ; 0 ; 0 ; 21999 ; 42 rand-4k-write ; 0 ; 0 ; 4498 ; 1124 rand-4k-read ; 8695 ; 2173 ; 0 ; 0 Sequential write speed 21999 KB / sec ( target 10000 ) - PASS Random write speed 1124 IOPS ( target 500 ) - PASS Random read speed 2173 IOPS ( target 1500 ) - PASS Test PASS","title":"Command Line Tips"},{"location":"command-line-tips/#command-line-tips","text":"","title":"Command Line Tips"},{"location":"command-line-tips/#get-setup","text":"1 2 3 git config --global user.name \"Joe Smith\" git config --global user.email \"Joe.Smith123@gmail.com\" git config --global credential.helper store","title":"Get Setup"},{"location":"command-line-tips/#raspberry-pi-command-line-tips","text":"From Terminal, you can open the current directory in the File Manager using the xdg-open command. This is similar to the Mac open command. 1 $ xdg-open .","title":"Raspberry Pi Command Line Tips"},{"location":"command-line-tips/#see-if-the-pwm-board-is-working","text":"1 i2cdetect -l This should return 1 i2c -1 i2c bcm2835 ( i2c @7e804000 ) I2C adapter 1 i2cdetect -y 1 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- Note that the line 40 and 70 has values under column 0 (I2C bus 1) If you unplug the data you should get: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --","title":"See If the PWM Board Is Working"},{"location":"command-line-tips/#sd-card-speed-test","text":"Home -> Accessories -> Raspberry Pi Diagnostics 1 2 3 4 5 6 7 8 9 10 11 12 13 Raspberry Pi Diagnostics - version 0 . 9 Sat Jul 3 14 : 25 : 23 2021 Test : SD Card Speed Test Run 1 prepare-file ; 0 ; 0 ; 20628 ; 40 seq-write ; 0 ; 0 ; 21999 ; 42 rand-4k-write ; 0 ; 0 ; 4498 ; 1124 rand-4k-read ; 8695 ; 2173 ; 0 ; 0 Sequential write speed 21999 KB / sec ( target 10000 ) - PASS Random write speed 1124 IOPS ( target 500 ) - PASS Random read speed 2173 IOPS ( target 1500 ) - PASS Test PASS","title":"SD Card Speed Test"},{"location":"contacts/","text":"AI Racing League Contacts Dan McCreary - LinkedIn","title":"Contacts"},{"location":"contacts/#ai-racing-league-contacts","text":"Dan McCreary - LinkedIn","title":"AI Racing League Contacts"},{"location":"curriculum/","text":"Curriculum We have a long term vision of using an intelligent agent that will recommend the right content for each of our students based on their current knowledge and their learning goals. Beginning (Green) Concepts Batteries Motors Donkey Car Activity Go to the donkey car station and look at the sample Donkey Car. Ask a mentor to show you the parts. Questions 1) What are the key parts of the Donkey Car? The key parts are: * RC Car chassis * Nvidia Jetson Nano * Servo controller * Camera * Battery for the Nano 2) How do the front wheels turn? A 180 degree servo is used to steer the car 3) Can you find an electric motor? There is only a single motor in the RC chassis 4) Can you find a battery? Are their multiple batteries? There are two batteries - one for the motor and one for the Jetson Nano 5) Where is the Jetson Nano (computer)? It is right on top! 6) Where is the camera? Is it on the front or back of the car? The camera is on the top facing forward 7) What happens to the opposite wheel when you turn it? The transmission makes the wheels turn in opposite direction when one wheel is turned. - Is this correct? 8) How much does a Donkey Car cost? The car costs around $250 each. The RC chassis cost about $110. 9) Why do you think they call it a \u201cDonkey Car\u201d? They call it a \"Donkey Car\" because, like a Donkey, it is functional but not very sleek. Intermediate Concepts Machine Learning Activity Go to the machine learning station and watch the demos. Ask about the difference between if-else statements and machine learning. Questions 1) What is Machine Learning? How does it differ from traditional rule-based programming? Machine learning is a method of data analysis that automates analytical model building, based on the idea that systems can learn from data. Rule-based programming is built off of if-else statements in code, and therefore every possible situation has to be thought of in advance by the programmer. Therefore, machine learning is well suited for situations where all possible inputs may not be defined. 2) How does a computer learn? The computer learns through a process called training. Training is the process of adjusting a mathematical formula by feeding it data and adjusting the formula until it produces the desired output. 3) What are the major groups of machine learning? There are 5 major groups of algorithms within machine learning. They are: * The connectionists (Neural Networks) * The analogizers (Support Vector Machines) * The Bayesians (Bayes\u2019 Theorem) * The evolutionaries (Genetic Algorithms) * The symbolists (Inverse Deduction) 4) Applications of machine learning are everywhere, what are some examples? Some applications of machine learning are: * Voice Assistants (Siri, Alexa, etc.) * Translation * Self-Driving Cars Blue Concepts Black Concepts","title":"Curriculum Overview"},{"location":"curriculum/#curriculum","text":"We have a long term vision of using an intelligent agent that will recommend the right content for each of our students based on their current knowledge and their learning goals.","title":"Curriculum"},{"location":"curriculum/#beginning-green-concepts","text":"","title":"Beginning (Green) Concepts"},{"location":"curriculum/#batteries","text":"","title":"Batteries"},{"location":"curriculum/#motors","text":"","title":"Motors"},{"location":"curriculum/#donkey-car","text":"","title":"Donkey Car"},{"location":"curriculum/#activity","text":"Go to the donkey car station and look at the sample Donkey Car. Ask a mentor to show you the parts.","title":"Activity"},{"location":"curriculum/#questions","text":"1) What are the key parts of the Donkey Car? The key parts are: * RC Car chassis * Nvidia Jetson Nano * Servo controller * Camera * Battery for the Nano 2) How do the front wheels turn? A 180 degree servo is used to steer the car 3) Can you find an electric motor? There is only a single motor in the RC chassis 4) Can you find a battery? Are their multiple batteries? There are two batteries - one for the motor and one for the Jetson Nano 5) Where is the Jetson Nano (computer)? It is right on top! 6) Where is the camera? Is it on the front or back of the car? The camera is on the top facing forward 7) What happens to the opposite wheel when you turn it? The transmission makes the wheels turn in opposite direction when one wheel is turned. - Is this correct? 8) How much does a Donkey Car cost? The car costs around $250 each. The RC chassis cost about $110. 9) Why do you think they call it a \u201cDonkey Car\u201d? They call it a \"Donkey Car\" because, like a Donkey, it is functional but not very sleek.","title":"Questions"},{"location":"curriculum/#intermediate-concepts","text":"","title":"Intermediate Concepts"},{"location":"curriculum/#machine-learning","text":"","title":"Machine Learning"},{"location":"curriculum/#activity_1","text":"Go to the machine learning station and watch the demos. Ask about the difference between if-else statements and machine learning.","title":"Activity"},{"location":"curriculum/#questions_1","text":"1) What is Machine Learning? How does it differ from traditional rule-based programming? Machine learning is a method of data analysis that automates analytical model building, based on the idea that systems can learn from data. Rule-based programming is built off of if-else statements in code, and therefore every possible situation has to be thought of in advance by the programmer. Therefore, machine learning is well suited for situations where all possible inputs may not be defined. 2) How does a computer learn? The computer learns through a process called training. Training is the process of adjusting a mathematical formula by feeding it data and adjusting the formula until it produces the desired output. 3) What are the major groups of machine learning? There are 5 major groups of algorithms within machine learning. They are: * The connectionists (Neural Networks) * The analogizers (Support Vector Machines) * The Bayesians (Bayes\u2019 Theorem) * The evolutionaries (Genetic Algorithms) * The symbolists (Inverse Deduction) 4) Applications of machine learning are everywhere, what are some examples? Some applications of machine learning are: * Voice Assistants (Siri, Alexa, etc.) * Translation * Self-Driving Cars","title":"Questions"},{"location":"curriculum/#blue-concepts","text":"","title":"Blue Concepts"},{"location":"curriculum/#black-concepts","text":"","title":"Black Concepts"},{"location":"demo/","text":"Demos Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intelligence we like to discuss in our classes. Here are some demos we use in our classrooms. The Teachable Machine by Google This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a \"classification\" model. Teachable Machine Much of our classroom work is centered around the hot topic of Deep Learning. But AI is much more than just Deep Learning. Here are a few other areas to consider. (Taken from the book The Master Algorithm) 5 Camps of Machine Learning Demos Connectionists (Neural Networks) Check Out TensorFlow Playground Analogizers (Support Vector Machines) TODO: FIND GOOD DEMO Bayesians (Bayes\u2019 Theorem) Check Out A Bayes' Theorem Example Evolutionaries (Genetic Algorithms) Watch This Animation Learn to Walk Symbolists (Inverse Deduction) Look at this Decision Tree Demo","title":"Demos"},{"location":"demo/#demos","text":"Although our students love hands-on learning with our DonkeyCars, there are other aspects of Artificial Intelligence we like to discuss in our classes. Here are some demos we use in our classrooms.","title":"Demos"},{"location":"demo/#the-teachable-machine-by-google","text":"This demo works with almost any PC that has a built-in video camera. You give it a set of images or pictures, or sounds and you build a model that predicts what a new images our sounds might be. This is called a \"classification\" model. Teachable Machine Much of our classroom work is centered around the hot topic of Deep Learning. But AI is much more than just Deep Learning. Here are a few other areas to consider. (Taken from the book The Master Algorithm)","title":"The Teachable Machine by Google"},{"location":"demo/#5-camps-of-machine-learning-demos","text":"","title":"5 Camps of Machine Learning Demos"},{"location":"demo/#connectionists-neural-networks","text":"Check Out TensorFlow Playground","title":"Connectionists (Neural Networks)"},{"location":"demo/#analogizers-support-vector-machines","text":"TODO: FIND GOOD DEMO","title":"Analogizers (Support Vector Machines)"},{"location":"demo/#bayesians-bayes-theorem","text":"Check Out A Bayes' Theorem Example","title":"Bayesians (Bayes\u2019 Theorem)"},{"location":"demo/#evolutionaries-genetic-algorithms","text":"Watch This Animation Learn to Walk","title":"Evolutionaries (Genetic Algorithms)"},{"location":"demo/#symbolists-inverse-deduction","text":"Look at this Decision Tree Demo","title":"Symbolists (Inverse Deduction)"},{"location":"faqs/","text":"AI Racing League Frequently Asked Questions How much does it cost? All our events are free. However, ff you want to build your own car you are welcome to bring these to the events. Parts for a DonkeyCar typically run about $250 US. See our Car Parts Lists for details. What do I have to know before I come? Nothing! We have material for beginners without any prior knowledge of AI. What car part hardware do you use? We use mostly NVIDIA Nano and Raspberry Pi 4 for our single board computers. We use a wide variety of RC-car engines but the [Exceed Magnet] 1/16 scale RC car is a low-cost standard. See our Car Parts Lists for details. Typical car parts cost around $250 US. What GPUs do you use and how much do they cost? We use a standard PC chassis running Lunix with a NVIDIA GPU such as a GTX 2080. These PCs can be purchased for around $1,500. Se our GPU Parts List for details. How do I sign up as a student? The best way to get involved is by signing up as a student at the CoderDojo Twin Cities web site: Coderdojotc.org How do I become a mentor? The best way to get involved is by signing up as a mentor at the CoderDojo Twin Cities web site: https://www.coderdojotc.org/mentor_signup/ How do I start my own chapter of the AI Racing League Please connect with Dan McCreary on LinkedIn and indicate in the note you would like to start your own chapter. Be sure to include information about your leadership and technical background and any related experience working with STEM programs. Can I get a grant to purchase hardware for our school or club? We are working on arranging a grant application process. The best way to start this process is to gather a small group of volunteers that can create a sustainable club. Include people that have a combination of fundraising, technology, education and marketing skills. Reach out to local school administration officials to build a community of science/math and STEM educators. Network with local companies that are trying to build local talent in AI and machine learning. Please contact Dan McCreary on LinkedIn for details.","title":"FAQs"},{"location":"faqs/#ai-racing-league-frequently-asked-questions","text":"","title":"AI Racing League Frequently Asked Questions"},{"location":"faqs/#how-much-does-it-cost","text":"All our events are free. However, ff you want to build your own car you are welcome to bring these to the events. Parts for a DonkeyCar typically run about $250 US. See our Car Parts Lists for details.","title":"How much does it cost?"},{"location":"faqs/#what-do-i-have-to-know-before-i-come","text":"Nothing! We have material for beginners without any prior knowledge of AI.","title":"What do I have to know before I come?"},{"location":"faqs/#what-car-part-hardware-do-you-use","text":"We use mostly NVIDIA Nano and Raspberry Pi 4 for our single board computers. We use a wide variety of RC-car engines but the [Exceed Magnet] 1/16 scale RC car is a low-cost standard. See our Car Parts Lists for details. Typical car parts cost around $250 US.","title":"What car part hardware do you use?"},{"location":"faqs/#what-gpus-do-you-use-and-how-much-do-they-cost","text":"We use a standard PC chassis running Lunix with a NVIDIA GPU such as a GTX 2080. These PCs can be purchased for around $1,500. Se our GPU Parts List for details.","title":"What GPUs do you use and how much do they cost?"},{"location":"faqs/#how-do-i-sign-up-as-a-student","text":"The best way to get involved is by signing up as a student at the CoderDojo Twin Cities web site: Coderdojotc.org","title":"How do I sign up as a student?"},{"location":"faqs/#how-do-i-become-a-mentor","text":"The best way to get involved is by signing up as a mentor at the CoderDojo Twin Cities web site: https://www.coderdojotc.org/mentor_signup/","title":"How do I become a mentor?"},{"location":"faqs/#how-do-i-start-my-own-chapter-of-the-ai-racing-league","text":"Please connect with Dan McCreary on LinkedIn and indicate in the note you would like to start your own chapter. Be sure to include information about your leadership and technical background and any related experience working with STEM programs.","title":"How do I start my own chapter of the AI Racing League"},{"location":"faqs/#can-i-get-a-grant-to-purchase-hardware-for-our-school-or-club","text":"We are working on arranging a grant application process. The best way to start this process is to gather a small group of volunteers that can create a sustainable club. Include people that have a combination of fundraising, technology, education and marketing skills. Reach out to local school administration officials to build a community of science/math and STEM educators. Network with local companies that are trying to build local talent in AI and machine learning. Please contact Dan McCreary on LinkedIn for details.","title":"Can I get a grant to purchase hardware for our school or club?"},{"location":"glossary/","text":"AI Racing League Glossary of Term Calibration A step in setting up a DonkeyCar where around five values configuration file is created that reflect the physical aspects of the RC car. There are three parameters for the throttle and two parameters for the steering. It is important to get these five parameters correct so you can precisely drive your DonkeyCar. Catalog File A format of storing our image-related throttle and steering data in line-oriented file where each line contains the serialized JSON information when the image was captured. Note that the catalog files are not pure JSON files. Only the data within each line is a valid data JSON object. The catalog file formats have changed between DonkeyCar releases. The current version is called V2 format. CoderDojo An international program of over 2,300 coding clubs that uses data-driven practices to get students interested in coding. Many of the aspects of the AI Racing League uses these same principals. Key aspects of CoderDojo are: No fees for events - accessible to all Mentor ratios of no more than three students per mentor Project-based learning Focus on getting students to work in teams (social learning) Student-directed projects Focus on programs for girls in coding and underprivileged youth Their main web site is: http://coderdojo.com/ CoderDojo Twin Cities Python Labs These labs are a set of free-courses to learn Python using fun turtle graphics. There is no experience needed. Link to CoderDojo Twin Cities Python Labs CoderDojo Twin Cities MicroPython Labs These labs are a set of free-courses to learn MicroPython. You should have a background in Python to use these labs. There are lessons in sensors, motors and robots. Link to CoderDojo Twin Cities MicroPython Labs CoderDojo Base MicroPython Robot This is a $25 robot that you build and program with MicroPython. If you are working on a project that will lead up to a full DonkeyCar, this is an ideal project to get you started. The robot will get you familiar with concepts like PWM, motor controllers and sensors. Blog article Microsite Raspberry Pi Pico MicroPython Base Robot Code Savvy Code Savvy is a not-for-profit organization with 501(c)3 status from the IRS that the AI Racing League works as a sub-project. All the AI Racing League financials are organized under a Code Savvy program. Donations to the AI Racing League should be done though Code Savvy donations. Questions about Code Savvy can be sent to kidscode@codesavvy.org Code Savvy Web Site Concept Cards These are small laminated cards that have concepts information on them that students can learn. The idea is one-concept per card. See the CoderDojo TC Guide for Authoring Concept Cards Donkey Car This is a trademarked name of a car that is used at our events. The name implies \"ugly\" so you know that they are not designed to look pretty, just functional cars with a camera on the front. DonkeyCar web site GPU Server Each of the AI Racing League events usually has at least one GPU server for training our models. These are typically small portable PCs with a GPU card in them. The entire GPU server cost around $1,200 each and can train a 20,000 image data set in under five minutes. We typically suggest that clubs writing grants use a NVIDIA GEFORCE RTX 2070 8GB or similar card since it is both fast enough for 10-team events but cost effective that schools can afford them. These card are often available used on e-Bay for a few hundred dollars. Note that we have tried to use cloud-based services at some of our events but we can't be guaranteed that there is enough WiFi bandwidth to move large datasets and models to and from the cloud. We feel that the tasks involved in setting up the GPU server is also a valuable skill for our students. See the GPU Parts List for a list of components. Electronic Speed Control An electronic circuit that controls and regulates the speed of an electric motor. It also can reverse the direction of the motor. Our ESC Wikipedia Page on Electronic Speed Control Fifteen Degree Camera Angle The angle our cameras need to point down to have a good view of the road ahead. Normalized Values that have been converted into a standard that can be used across many situations. For example, we don't store the exact PWM ratios of the throttle and steering values in our catalog files. We convert these values into ranges from 0.0 to 1.0 so that all our machine learning models can share them. This is why we also need the configuration values when the drive commands are used to convert the normalized values back to the appropriate PWM ranges unique to each car. Pulse Width Modulation The way that we control the [Electronic Speed Controller] (ESC) and the servo by sending digital square waves with a variable ratio of the width of the positive part of the square wave. Wikipeda Page on Pulse-width modulation Tracks We want our clubs to all have affordable but high-quality tracks that are easy to roll up and store. Our suggestion is to find used billboard vinyl in a dark color (black or dark blue) and then use white and yellow tape to place down the lines. https://billboardtarps.com/product-category/billboard-vinyl/ YouTube Video Training Step The step in DonkeyCar setup where we take approximately 20,000 small image files and the throttle and steering information with each image to build a deep neural network. The training step requires us to move the data off the DonkeyCar's SD card and transfer the data to a more powerful GPU server. Using a typical $1,200 GPU server we can build a model file in around five minutes. This file is then transferred back to the DonkeyCar for autonomous driving. Tubs This is the term that the DonkeyCar software uses to store training data. Each tub consists of a catalog of information about the drive and the images associated with that drive. Note that the format of the tubs changes over time so old tubs formats may need to be converted to newer formats. Script to Convert Tugs from V1 format to V2 Format DonkeyCar Catalog Format Tub Catalog Format Each Tub is a directory (folder) has two components: A sub folder called \"images\" that contains the jpeg images gathered during a training run. There are typically 10,000 to 20,000 small images in a tub image folder. A file that describes the data about all the images called a Catalog file. The Catalog file is similar to a JSON file but it has no root data elements. NVIDIA Nano One of the two single board computers we use in our DonkeyCars. The current Nanos have 4GB RAM and a GPU for accelerating real-time inference. The full product name is the NVIDIA Jetson Nano. The price for a 4GB Nano is around $99 but they occasionally go on sale for $79. The Nano became available for sale in the US in April of 2019. A 2GB version has also been sold for $59 but the lack of RAM memory makes it difficult to use for many of our AI Racing League events and we don't recommend it. Note that we do not use the Nano for training. We transfer the data to a GPU server that has more parallel cores for training.","title":"Glossary"},{"location":"glossary/#ai-racing-league-glossary-of-term","text":"","title":"AI Racing League Glossary of Term"},{"location":"glossary/#calibration","text":"A step in setting up a DonkeyCar where around five values configuration file is created that reflect the physical aspects of the RC car. There are three parameters for the throttle and two parameters for the steering. It is important to get these five parameters correct so you can precisely drive your DonkeyCar.","title":"Calibration"},{"location":"glossary/#catalog-file","text":"A format of storing our image-related throttle and steering data in line-oriented file where each line contains the serialized JSON information when the image was captured. Note that the catalog files are not pure JSON files. Only the data within each line is a valid data JSON object. The catalog file formats have changed between DonkeyCar releases. The current version is called V2 format.","title":"Catalog File"},{"location":"glossary/#coderdojo","text":"An international program of over 2,300 coding clubs that uses data-driven practices to get students interested in coding. Many of the aspects of the AI Racing League uses these same principals. Key aspects of CoderDojo are: No fees for events - accessible to all Mentor ratios of no more than three students per mentor Project-based learning Focus on getting students to work in teams (social learning) Student-directed projects Focus on programs for girls in coding and underprivileged youth Their main web site is: http://coderdojo.com/","title":"CoderDojo"},{"location":"glossary/#coderdojo-twin-cities-python-labs","text":"These labs are a set of free-courses to learn Python using fun turtle graphics. There is no experience needed. Link to CoderDojo Twin Cities Python Labs","title":"CoderDojo Twin Cities Python Labs"},{"location":"glossary/#coderdojo-twin-cities-micropython-labs","text":"These labs are a set of free-courses to learn MicroPython. You should have a background in Python to use these labs. There are lessons in sensors, motors and robots. Link to CoderDojo Twin Cities MicroPython Labs","title":"CoderDojo Twin Cities MicroPython Labs"},{"location":"glossary/#coderdojo-base-micropython-robot","text":"This is a $25 robot that you build and program with MicroPython. If you are working on a project that will lead up to a full DonkeyCar, this is an ideal project to get you started. The robot will get you familiar with concepts like PWM, motor controllers and sensors. Blog article Microsite Raspberry Pi Pico MicroPython Base Robot","title":"CoderDojo Base MicroPython Robot"},{"location":"glossary/#code-savvy","text":"Code Savvy is a not-for-profit organization with 501(c)3 status from the IRS that the AI Racing League works as a sub-project. All the AI Racing League financials are organized under a Code Savvy program. Donations to the AI Racing League should be done though Code Savvy donations. Questions about Code Savvy can be sent to kidscode@codesavvy.org Code Savvy Web Site","title":"Code Savvy"},{"location":"glossary/#concept-cards","text":"These are small laminated cards that have concepts information on them that students can learn. The idea is one-concept per card. See the CoderDojo TC Guide for Authoring Concept Cards","title":"Concept Cards"},{"location":"glossary/#donkey-car","text":"This is a trademarked name of a car that is used at our events. The name implies \"ugly\" so you know that they are not designed to look pretty, just functional cars with a camera on the front. DonkeyCar web site","title":"Donkey Car"},{"location":"glossary/#gpu-server","text":"Each of the AI Racing League events usually has at least one GPU server for training our models. These are typically small portable PCs with a GPU card in them. The entire GPU server cost around $1,200 each and can train a 20,000 image data set in under five minutes. We typically suggest that clubs writing grants use a NVIDIA GEFORCE RTX 2070 8GB or similar card since it is both fast enough for 10-team events but cost effective that schools can afford them. These card are often available used on e-Bay for a few hundred dollars. Note that we have tried to use cloud-based services at some of our events but we can't be guaranteed that there is enough WiFi bandwidth to move large datasets and models to and from the cloud. We feel that the tasks involved in setting up the GPU server is also a valuable skill for our students. See the GPU Parts List for a list of components.","title":"GPU Server"},{"location":"glossary/#electronic-speed-control","text":"An electronic circuit that controls and regulates the speed of an electric motor. It also can reverse the direction of the motor. Our ESC Wikipedia Page on Electronic Speed Control","title":"Electronic Speed Control"},{"location":"glossary/#fifteen-degree-camera-angle","text":"The angle our cameras need to point down to have a good view of the road ahead.","title":"Fifteen Degree Camera Angle"},{"location":"glossary/#normalized","text":"Values that have been converted into a standard that can be used across many situations. For example, we don't store the exact PWM ratios of the throttle and steering values in our catalog files. We convert these values into ranges from 0.0 to 1.0 so that all our machine learning models can share them. This is why we also need the configuration values when the drive commands are used to convert the normalized values back to the appropriate PWM ranges unique to each car.","title":"Normalized"},{"location":"glossary/#pulse-width-modulation","text":"The way that we control the [Electronic Speed Controller] (ESC) and the servo by sending digital square waves with a variable ratio of the width of the positive part of the square wave. Wikipeda Page on Pulse-width modulation","title":"Pulse Width Modulation"},{"location":"glossary/#tracks","text":"We want our clubs to all have affordable but high-quality tracks that are easy to roll up and store. Our suggestion is to find used billboard vinyl in a dark color (black or dark blue) and then use white and yellow tape to place down the lines. https://billboardtarps.com/product-category/billboard-vinyl/ YouTube Video","title":"Tracks"},{"location":"glossary/#training-step","text":"The step in DonkeyCar setup where we take approximately 20,000 small image files and the throttle and steering information with each image to build a deep neural network. The training step requires us to move the data off the DonkeyCar's SD card and transfer the data to a more powerful GPU server. Using a typical $1,200 GPU server we can build a model file in around five minutes. This file is then transferred back to the DonkeyCar for autonomous driving.","title":"Training Step"},{"location":"glossary/#tubs","text":"This is the term that the DonkeyCar software uses to store training data. Each tub consists of a catalog of information about the drive and the images associated with that drive. Note that the format of the tubs changes over time so old tubs formats may need to be converted to newer formats. Script to Convert Tugs from V1 format to V2 Format DonkeyCar Catalog Format","title":"Tubs"},{"location":"glossary/#tub-catalog-format","text":"Each Tub is a directory (folder) has two components: A sub folder called \"images\" that contains the jpeg images gathered during a training run. There are typically 10,000 to 20,000 small images in a tub image folder. A file that describes the data about all the images called a Catalog file. The Catalog file is similar to a JSON file but it has no root data elements.","title":"Tub Catalog Format"},{"location":"glossary/#nvidia-nano","text":"One of the two single board computers we use in our DonkeyCars. The current Nanos have 4GB RAM and a GPU for accelerating real-time inference. The full product name is the NVIDIA Jetson Nano. The price for a 4GB Nano is around $99 but they occasionally go on sale for $79. The Nano became available for sale in the US in April of 2019. A 2GB version has also been sold for $59 but the lack of RAM memory makes it difficult to use for many of our AI Racing League events and we don't recommend it. Note that we do not use the Nano for training. We transfer the data to a GPU server that has more parallel cores for training.","title":"NVIDIA Nano"},{"location":"google-analytics/","text":"Google Analytics Our Google Tracking ID is: G-RL4MZ0MHZ4 You can see the activity here: Google Dashboard How We Enabled Google Analytics mkdocs material supports Google Analysis. We only need to add four lines to our mkdocs.yml configuration file. 1 2 3 4 extra : analytics : provider : google property : G - RL4MZ0MHZ4 See our mkdocs.yml on GitHub here: mkdocs.yml file in GitHub The following line is placed into each HTML web page in the site branch: 1 < script async = \"\" src = \"https://www.googletagmanager.com/gtag/js?id=G-RL4MZ0MHZ4\" >","title":"Google Analytics"},{"location":"google-analytics/#google-analytics","text":"Our Google Tracking ID is: G-RL4MZ0MHZ4 You can see the activity here: Google Dashboard","title":"Google Analytics"},{"location":"google-analytics/#how-we-enabled-google-analytics","text":"mkdocs material supports Google Analysis. We only need to add four lines to our mkdocs.yml configuration file. 1 2 3 4 extra : analytics : provider : google property : G - RL4MZ0MHZ4 See our mkdocs.yml on GitHub here: mkdocs.yml file in GitHub The following line is placed into each HTML web page in the site branch: 1 < script async = \"\" src = \"https://www.googletagmanager.com/gtag/js?id=G-RL4MZ0MHZ4\" >","title":"How We Enabled Google Analytics"},{"location":"hackathon/","text":"Hackathon Ideas Here are a set of ideas that can be used to plan a Hackathon around the DonkeyCar. Of course, if people are not familiar with the DonkeyCar, just getting it to work is a good project! These are more for teams that are extending the DonkeyCar software. Beginner Projects - done in under one day Ceate a UNIX shell script for managing the tub and model files. The script should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Build an RGB strip interface to display car and GPU status. The car status can move from red to green as the number of images gathered reaches a 10K image target. Use the Arduino Moving Rainbow site as your guide. Background with Arduino is helpful. Build an RGB strip interface to display the GPU training status. The RGB strip should change from red to green as the model error approaches a reasonable value like 0.01. Background with Arduino is helpful. You will also need to modify the TensorFlow interface to write error values to a serial port using python. Medium Projects - could be done with prep over a weekend Ceate a web interface for managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Create a Jypyter notebook for analysing data and managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Advanced Projects Create a mobile application to drive the car during training. This is the best practice for many low-cost robots like the MiP. Use the tilt APIs to make the car easy to steer. Create small and large versions of the DonkeyCar. The small version should work on a 12x16 track and the large version should work outdoors on grass. Use a Raspberry Pi or Nvidia Nano. Create a learning management system for running AI Racing League events. Create a list of concepts and load a dependancy list of concepts into a graph database like TigerGraph. Create a quiz that attendees use to enter their learning objectives and background. The app should then recomend what content they should use, what tables they should visit, and what mentors they should connect with in the right order. Bonus points of you build a cell phone front end. Car to GPU File Transfer Scripts Make it easy to transfer DonkeyCar test data to our GPU server. Start with a UNIX shell script that compresses the tub file and puts the data on a jump drive. Then work on using SSH to copy the files to the GPU server. Then add configuration of the Avahi application and the mDNS protocols to autodiscover the ARL GPU servers and prompte the user. Mobile App to Drive The Car Most robot systems like the MIP have a simple mobile application for driving your robot around. There are two modes: A tilt mode (where you steer by tilting the phone) and a pressure mode where you can control the speed and direction by pressing on a virtual joystick. The problem we have with the current DonkeyCar 3.X system is that the web-based application is difficult to use. The tilt mode does not work on web browsers. We suggest you use a program like AppInventor for Android or Google Flutter and Dash building mobile apps. Leaderboard Web Page Create a web application that tracks what teams are in the lead. The app should be a single-page application that allows team scores to be updated on a web form. The leaderboard can also be \"smart\" a look for the team config files on each DonkeyCar on the local-area network. OLED Extension Add a low-cost OLED screen to each car using the SPI bus. Have the OLED screen show key parameters such as hostname, static IP address, disk space free, training data size etc. Bonus points for a mode button to cycle through screens. See Dan McCreary for the hardware. LED Strips for Training Server Status Add an low-cost WS-2811-B LED strip to the GPU server. Make the strip blue when idle, red when you start training an new model, and have it fade to green as the model converges. See Dan McCreary for the hardware. Training Graph As students walk in, give them a tablet to register. It will also ask them basic questions. It will then ask them how long they will be there. It will then suggest a set of activities and some concepts to master. The graph is a dependacy graph of all the concepts we teach at the event. Also suggest a probability they will have fun at the event. Single Source Publishing for Concept Cards Our cards need to be authored in MarkDown but we want to disply on the web, in PPT and with PDF. To do this we want to adopt a single-source publishing pipeline.","title":"Hackathon"},{"location":"hackathon/#hackathon-ideas","text":"Here are a set of ideas that can be used to plan a Hackathon around the DonkeyCar. Of course, if people are not familiar with the DonkeyCar, just getting it to work is a good project! These are more for teams that are extending the DonkeyCar software.","title":"Hackathon Ideas"},{"location":"hackathon/#beginner-projects-done-in-under-one-day","text":"Ceate a UNIX shell script for managing the tub and model files. The script should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Build an RGB strip interface to display car and GPU status. The car status can move from red to green as the number of images gathered reaches a 10K image target. Use the Arduino Moving Rainbow site as your guide. Background with Arduino is helpful. Build an RGB strip interface to display the GPU training status. The RGB strip should change from red to green as the model error approaches a reasonable value like 0.01. Background with Arduino is helpful. You will also need to modify the TensorFlow interface to write error values to a serial port using python.","title":"Beginner Projects - done in under one day"},{"location":"hackathon/#medium-projects-could-be-done-with-prep-over-a-weekend","text":"Ceate a web interface for managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes. Create a Jypyter notebook for analysing data and managing the tub and model files. The web interface should present a menu of options that includes seending one or more tubs to a server for training and getting the model file back. Bonus points for listing models and sizes.","title":"Medium Projects - could be done with prep over a weekend"},{"location":"hackathon/#advanced-projects","text":"Create a mobile application to drive the car during training. This is the best practice for many low-cost robots like the MiP. Use the tilt APIs to make the car easy to steer. Create small and large versions of the DonkeyCar. The small version should work on a 12x16 track and the large version should work outdoors on grass. Use a Raspberry Pi or Nvidia Nano. Create a learning management system for running AI Racing League events. Create a list of concepts and load a dependancy list of concepts into a graph database like TigerGraph. Create a quiz that attendees use to enter their learning objectives and background. The app should then recomend what content they should use, what tables they should visit, and what mentors they should connect with in the right order. Bonus points of you build a cell phone front end.","title":"Advanced Projects"},{"location":"hackathon/#car-to-gpu-file-transfer-scripts","text":"Make it easy to transfer DonkeyCar test data to our GPU server. Start with a UNIX shell script that compresses the tub file and puts the data on a jump drive. Then work on using SSH to copy the files to the GPU server. Then add configuration of the Avahi application and the mDNS protocols to autodiscover the ARL GPU servers and prompte the user.","title":"Car to GPU File Transfer Scripts"},{"location":"hackathon/#mobile-app-to-drive-the-car","text":"Most robot systems like the MIP have a simple mobile application for driving your robot around. There are two modes: A tilt mode (where you steer by tilting the phone) and a pressure mode where you can control the speed and direction by pressing on a virtual joystick. The problem we have with the current DonkeyCar 3.X system is that the web-based application is difficult to use. The tilt mode does not work on web browsers. We suggest you use a program like AppInventor for Android or Google Flutter and Dash building mobile apps.","title":"Mobile App to Drive The Car"},{"location":"hackathon/#leaderboard-web-page","text":"Create a web application that tracks what teams are in the lead. The app should be a single-page application that allows team scores to be updated on a web form. The leaderboard can also be \"smart\" a look for the team config files on each DonkeyCar on the local-area network.","title":"Leaderboard Web Page"},{"location":"hackathon/#oled-extension","text":"Add a low-cost OLED screen to each car using the SPI bus. Have the OLED screen show key parameters such as hostname, static IP address, disk space free, training data size etc. Bonus points for a mode button to cycle through screens. See Dan McCreary for the hardware.","title":"OLED Extension"},{"location":"hackathon/#led-strips-for-training-server-status","text":"Add an low-cost WS-2811-B LED strip to the GPU server. Make the strip blue when idle, red when you start training an new model, and have it fade to green as the model converges. See Dan McCreary for the hardware.","title":"LED Strips for Training Server Status"},{"location":"hackathon/#training-graph","text":"As students walk in, give them a tablet to register. It will also ask them basic questions. It will then ask them how long they will be there. It will then suggest a set of activities and some concepts to master. The graph is a dependacy graph of all the concepts we teach at the event. Also suggest a probability they will have fun at the event.","title":"Training Graph"},{"location":"hackathon/#single-source-publishing-for-concept-cards","text":"Our cards need to be authored in MarkDown but we want to disply on the web, in PPT and with PDF. To do this we want to adopt a single-source publishing pipeline.","title":"Single Source Publishing for Concept Cards"},{"location":"learning-strategy/","text":"AI Racing League Educational Philosophy The AI Racing League educational philosophy is founded on the following values: Equal Opportunity - we work hard to keep all AI Racing League activities free and we work hard to encourage girls to be part of our programs. Student driven - we ask each student what their learning goals are and adapt to their needs Project based - we prefer to let students define their own projects and we find resources to support them. If learning about how to get a car to drive by itself that is great, but if they have other objectives we work hard to connect them with the mentor that will help them build whatever they are interested in building. Teamwork - we want students to work in teams so they learn not just about AI, but how to work with others. Flexibility - we want to be known as one of the most flexible learning organizations around. We don't force everyone to learn the same things. We take students in for 20 minutes or two years. We adapt to the needs of our students and we design our curriculum around their needs. Agility - in software there is a strong concept of \"Agile Development\" where team constantly get feedback on what works and adapt their goals every two weeks to meet the needs of their users. We use these same strategies to develop flexible content to meet the ever-changing interests of our students. Our Curriculum is based around building a series of concept cards that adhere to the \"one concept per card\" rule. Each card is a 5.5in X 8in laminated card with questions or challenges on the front and answers on the back. Concept cards have three difficulty levels with different colored borders. Green Borders - Beginner cards that anyone can start with at any time Blue Borders - Intermediate - where you may need to know some beginning concepts before you start Black Borders - Advanced - where you need to master several intermediate concepts before you take these on Our goal is to keep the concepts as \"flat\" as possible without a deep level of dependency. We try to keep at least half of our cards mostly green beginner cards. Students will walk into the AI Racing League and see a stack of cards. They will pick up one card or a set of cards and work on these. When they are done they return the cards and select another set of cards. Because of our Concept Cards in Google Docs Engineering Challenges To develop a world class curriculum, we need to partner with senior engineers and curriculum developers. Here are some of the challenges we need to address. Challenge #1: Make it easy for short term learning Engineers with experience in both hardware and software can build their own DonkeyCar from parts in a few weeks, our goal is to allow students from a wide variety of backgrounds to be able to participate in events in a flexible way. A typical CoderDojo event typically only lasts two hours and students may not have the appropriate background in hardware, Python programming or UNIX. Challenge #2: On site traning hardware Many people that are building DonkeyCars use a standard Mac or PC laptop. These systems take up to two hours to train a typical model - too long for many events. One solution would be to leverage clound-based GPUs to accelerate learning. This option typically requires transferring around 1/2 GB of images up to the clound for training the models. Models, which can typically be 10MB, then need to be transferred back from the clound to the local car. Our challenge here is that many locations may not have high-bandwith uploading and downloading services that could handle this traffic. One solution is to acquire some robust GPUs that students can use to quickly train complex models - typically in 15 to 20 minutes. This hardware needs to be easy to use - for example we need to do folder-based drag and drops and press a single button to begin training.","title":"Learning Strategy"},{"location":"learning-strategy/#ai-racing-league-educational-philosophy","text":"The AI Racing League educational philosophy is founded on the following values: Equal Opportunity - we work hard to keep all AI Racing League activities free and we work hard to encourage girls to be part of our programs. Student driven - we ask each student what their learning goals are and adapt to their needs Project based - we prefer to let students define their own projects and we find resources to support them. If learning about how to get a car to drive by itself that is great, but if they have other objectives we work hard to connect them with the mentor that will help them build whatever they are interested in building. Teamwork - we want students to work in teams so they learn not just about AI, but how to work with others. Flexibility - we want to be known as one of the most flexible learning organizations around. We don't force everyone to learn the same things. We take students in for 20 minutes or two years. We adapt to the needs of our students and we design our curriculum around their needs. Agility - in software there is a strong concept of \"Agile Development\" where team constantly get feedback on what works and adapt their goals every two weeks to meet the needs of their users. We use these same strategies to develop flexible content to meet the ever-changing interests of our students. Our Curriculum is based around building a series of concept cards that adhere to the \"one concept per card\" rule. Each card is a 5.5in X 8in laminated card with questions or challenges on the front and answers on the back. Concept cards have three difficulty levels with different colored borders. Green Borders - Beginner cards that anyone can start with at any time Blue Borders - Intermediate - where you may need to know some beginning concepts before you start Black Borders - Advanced - where you need to master several intermediate concepts before you take these on Our goal is to keep the concepts as \"flat\" as possible without a deep level of dependency. We try to keep at least half of our cards mostly green beginner cards. Students will walk into the AI Racing League and see a stack of cards. They will pick up one card or a set of cards and work on these. When they are done they return the cards and select another set of cards. Because of our Concept Cards in Google Docs","title":"AI Racing League Educational Philosophy"},{"location":"learning-strategy/#engineering-challenges","text":"To develop a world class curriculum, we need to partner with senior engineers and curriculum developers. Here are some of the challenges we need to address.","title":"Engineering Challenges"},{"location":"learning-strategy/#challenge-1-make-it-easy-for-short-term-learning","text":"Engineers with experience in both hardware and software can build their own DonkeyCar from parts in a few weeks, our goal is to allow students from a wide variety of backgrounds to be able to participate in events in a flexible way. A typical CoderDojo event typically only lasts two hours and students may not have the appropriate background in hardware, Python programming or UNIX.","title":"Challenge #1: Make it easy for short term learning"},{"location":"learning-strategy/#challenge-2-on-site-traning-hardware","text":"Many people that are building DonkeyCars use a standard Mac or PC laptop. These systems take up to two hours to train a typical model - too long for many events. One solution would be to leverage clound-based GPUs to accelerate learning. This option typically requires transferring around 1/2 GB of images up to the clound for training the models. Models, which can typically be 10MB, then need to be transferred back from the clound to the local car. Our challenge here is that many locations may not have high-bandwith uploading and downloading services that could handle this traffic. One solution is to acquire some robust GPUs that students can use to quickly train complex models - typically in 15 to 20 minutes. This hardware needs to be easy to use - for example we need to do folder-based drag and drops and press a single button to begin training.","title":"Challenge #2: On site traning hardware"},{"location":"media/","text":"Media Ready, Set, Algorithms! Teams Learn AI by Racing Cars Morningstar, Liberty Mutual workers are coming up with business ideas after exploring machine learning via mini self-driving vehicles","title":"Media"},{"location":"media/#media","text":"Ready, Set, Algorithms! Teams Learn AI by Racing Cars Morningstar, Liberty Mutual workers are coming up with business ideas after exploring machine learning via mini self-driving vehicles","title":"Media"},{"location":"presentations/","text":"AI Racing League Presentations These presentations are all licensed under our creative commons share alike non-commercial with attribution licenses. Welcome to the AI Racing League - slides used for the kickoff of a six week summer camp on building DonkeyCars AI Racing League Code Savvy - presented to out state Minnesota educators in April 2021 November 2019 Update - presentations done in November of 2019 after our fourth \"sprint\" making improvements on our process.","title":"List of Presentations"},{"location":"presentations/#ai-racing-league-presentations","text":"These presentations are all licensed under our creative commons share alike non-commercial with attribution licenses. Welcome to the AI Racing League - slides used for the kickoff of a six week summer camp on building DonkeyCars AI Racing League Code Savvy - presented to out state Minnesota educators in April 2021 November 2019 Update - presentations done in November of 2019 after our fourth \"sprint\" making improvements on our process.","title":"AI Racing League Presentations"},{"location":"resources/","text":"Community Here are some sites that are of interest: CoderDojo Twin Cities - where you can sign up to be a mentor or student Twin Cities AI Racing League Meetup Site - where we announce our public meetings DonkeyCar Hardware DonkeyCar web site Donkey Car Nano Setup Page DonkeyCar Assembly Video - Chris Anderson's detailed assembly video from 2018. Track Options Hardware Options Raspberry Pi 3, 4, the Nvidia Nano, the Nvdia DX2, and the Intel Mobius Neural Stick The base DonkeyCar today uses the Raspberry Pi 3+ which has a list price of $35. This hardware is just barly able to process images in real-time. Small changes in lighting will throw the car off the track. The new Raspberry Pi 4 with 4GB RAM is a new option. The Nvidia Nano on the other hand has 128 CUDA core processors and has more than enough power to drive around a track in real time with varied lighting conditions. This is the hardware we have used for our first generation cars in the AI Racing League. There are also college-level autonomous driving teams that use the more expensive Nvidia DX2 hardware. Nvidia Nano Jetson Nano References Joseph Bastulli PyTorch Nano Nvidia Jetson Developer Kit Nvidia Jetson Nano Kaya Video Adding a Joystick to your DonkeyCar - From Dan McCreary's Blog Videos Video of Wide Track PID Theory and Steering - why using machine learning is easier than setting PID parameters. This is covered in control theory. Real time optimal control of an autonomous RC car with minimum-time maneuvers - nice video of optimization of driving algorithm using a \"U\" shaped track. Sparkfun Autonomous Vehicle Race from 2016 Ed Murphy on Maker Faire","title":"Resources"},{"location":"resources/#community","text":"Here are some sites that are of interest: CoderDojo Twin Cities - where you can sign up to be a mentor or student Twin Cities AI Racing League Meetup Site - where we announce our public meetings","title":"Community"},{"location":"resources/#donkeycar-hardware","text":"DonkeyCar web site Donkey Car Nano Setup Page DonkeyCar Assembly Video - Chris Anderson's detailed assembly video from 2018.","title":"DonkeyCar Hardware"},{"location":"resources/#track-options","text":"","title":"Track Options"},{"location":"resources/#hardware-options","text":"Raspberry Pi 3, 4, the Nvidia Nano, the Nvdia DX2, and the Intel Mobius Neural Stick The base DonkeyCar today uses the Raspberry Pi 3+ which has a list price of $35. This hardware is just barly able to process images in real-time. Small changes in lighting will throw the car off the track. The new Raspberry Pi 4 with 4GB RAM is a new option. The Nvidia Nano on the other hand has 128 CUDA core processors and has more than enough power to drive around a track in real time with varied lighting conditions. This is the hardware we have used for our first generation cars in the AI Racing League. There are also college-level autonomous driving teams that use the more expensive Nvidia DX2 hardware.","title":"Hardware Options"},{"location":"resources/#nvidia-nano","text":"Jetson Nano References Joseph Bastulli PyTorch Nano Nvidia Jetson Developer Kit Nvidia Jetson Nano Kaya Video Adding a Joystick to your DonkeyCar - From Dan McCreary's Blog","title":"Nvidia Nano"},{"location":"resources/#videos","text":"Video of Wide Track PID Theory and Steering - why using machine learning is easier than setting PID parameters. This is covered in control theory. Real time optimal control of an autonomous RC car with minimum-time maneuvers - nice video of optimization of driving algorithm using a \"U\" shaped track. Sparkfun Autonomous Vehicle Race from 2016 Ed Murphy on Maker Faire","title":"Videos"},{"location":"six-week-curriculum/","text":"Sample Six Week Curriculum This is a sample suggested curriculum for a six week AI Racing League summer school project. The students would all meet together for two hours, once a week. There are then homework assignments. The students don't need any prior experience. Week 1: Overview and Unboxing Slides: Welcome to the AI Racing League? Link to Slides What is the DonkeyCar? Lab: Unbox the car (requires tools such as cable tie cutter and screwdrivers) What is AI? What is Machine Learning? What is Python? Introduction to Python course Motors and servos (demo of car driving with the motors and servos being controlled by RC) Make sure students know how to turn on the ESC and listen for the startup beep sound See the suggested parts list for week 1 Week 2: Booting a Raspberry Pi, UNIX, Calibration, Intro to Python and Raspberry Pi Booting a Raspberry Pi from Micro SD card What is a Raspberry Pi? How much RAM do we need? Why is 4GB important for the AI Racing League? What is a micro SD card? How big a card do we need? 32GB vs 65GB vs 128GB Can we train our model on a Pi? Training vs. Inference - when do we need a GPU? What is an Operating System Image file? How do we create an image file? Download a Raspberry Pi image Raspberry Pi Imager Burn a microSD card with that image - include customization Use the microSD card to boot your Raspberry Pi (requires 4GB Raspberry Pi Pico, keyboard, mouse, power supply, monitor) Configure Pi desktop - learn how to use menus, add bookmarks to the web browser, manage bookmarks Start Python IDE Run \"hello world\" in Python Open a Terminal and type \"ls\" Download the DonkeyCar software Get familiar with the folder layout Verify the connections from the Pi to the PWM card and the DonkeyCar Run the calibration command, write down the numbers for throttle and steering Week 3: Python, Configuration, Drive More Python labs - get as far as possible through the Introduction to Python class Get familiar with the Donkey Car configuration file Focus on the key parameters for calibration Find the Drive command Discuss options for controlling the car: Joystick vs Web Application Backup Career Exploration: What is a Software Engineer? Backup Lab: Google Teachable Machines Week 4: Gather Image Data and Analyze Quality with Jupyter Notebooks Drive around the track and gather image data Look at the image data in the tubs Run a basic Python program to count the number of files Learn about a Jupyter Notebook Backup Career Exploration: What is a Data Scientist? Week 5: The GPU and Training Learn about the GPU - what are GPU cores? - Why is training time faster? What is a conda environment for Python? What is Miniconda Download here Activating conda environments Verifying that the GPU setting are correct Run a test program on the GPU Learn how to transfer files from the car's memory to the GPU (compress tubs, copy to jump drive) What is a model file? How big is your model? What are model parameters? Backup: What is Bias in AI? How to we detect it? How dow we measure it? Week 6: Using the Model to Drive Autonomously Put the model file on the Donkey car Run the drive with model command Change the configuration files Evaluate image quality","title":"Sample Six Week Course"},{"location":"six-week-curriculum/#sample-six-week-curriculum","text":"This is a sample suggested curriculum for a six week AI Racing League summer school project. The students would all meet together for two hours, once a week. There are then homework assignments. The students don't need any prior experience.","title":"Sample Six Week Curriculum"},{"location":"six-week-curriculum/#week-1-overview-and-unboxing","text":"Slides: Welcome to the AI Racing League? Link to Slides What is the DonkeyCar? Lab: Unbox the car (requires tools such as cable tie cutter and screwdrivers) What is AI? What is Machine Learning? What is Python? Introduction to Python course Motors and servos (demo of car driving with the motors and servos being controlled by RC) Make sure students know how to turn on the ESC and listen for the startup beep sound See the suggested parts list for week 1","title":"Week 1: Overview and Unboxing"},{"location":"six-week-curriculum/#week-2-booting-a-raspberry-pi-unix-calibration-intro-to-python-and-raspberry-pi","text":"Booting a Raspberry Pi from Micro SD card What is a Raspberry Pi? How much RAM do we need? Why is 4GB important for the AI Racing League? What is a micro SD card? How big a card do we need? 32GB vs 65GB vs 128GB Can we train our model on a Pi? Training vs. Inference - when do we need a GPU? What is an Operating System Image file? How do we create an image file? Download a Raspberry Pi image Raspberry Pi Imager Burn a microSD card with that image - include customization Use the microSD card to boot your Raspberry Pi (requires 4GB Raspberry Pi Pico, keyboard, mouse, power supply, monitor) Configure Pi desktop - learn how to use menus, add bookmarks to the web browser, manage bookmarks Start Python IDE Run \"hello world\" in Python Open a Terminal and type \"ls\" Download the DonkeyCar software Get familiar with the folder layout Verify the connections from the Pi to the PWM card and the DonkeyCar Run the calibration command, write down the numbers for throttle and steering","title":"Week 2: Booting a Raspberry Pi, UNIX, Calibration, Intro to Python and Raspberry Pi"},{"location":"six-week-curriculum/#week-3-python-configuration-drive","text":"More Python labs - get as far as possible through the Introduction to Python class Get familiar with the Donkey Car configuration file Focus on the key parameters for calibration Find the Drive command Discuss options for controlling the car: Joystick vs Web Application Backup Career Exploration: What is a Software Engineer? Backup Lab: Google Teachable Machines","title":"Week 3: Python, Configuration, Drive"},{"location":"six-week-curriculum/#week-4-gather-image-data-and-analyze-quality-with-jupyter-notebooks","text":"Drive around the track and gather image data Look at the image data in the tubs Run a basic Python program to count the number of files Learn about a Jupyter Notebook Backup Career Exploration: What is a Data Scientist?","title":"Week 4: Gather Image Data and Analyze Quality with Jupyter Notebooks"},{"location":"six-week-curriculum/#week-5-the-gpu-and-training","text":"Learn about the GPU - what are GPU cores? - Why is training time faster? What is a conda environment for Python? What is Miniconda Download here Activating conda environments Verifying that the GPU setting are correct Run a test program on the GPU Learn how to transfer files from the car's memory to the GPU (compress tubs, copy to jump drive) What is a model file? How big is your model? What are model parameters? Backup: What is Bias in AI? How to we detect it? How dow we measure it?","title":"Week 5: The GPU and Training"},{"location":"six-week-curriculum/#week-6-using-the-model-to-drive-autonomously","text":"Put the model file on the Donkey car Run the drive with model command Change the configuration files Evaluate image quality","title":"Week 6: Using the Model to Drive Autonomously"},{"location":"admin/01-intro/","text":"League Administers Page SD Image This section show how leage administrators can create their own SD image files.","title":"Introduction"},{"location":"admin/01-intro/#league-administers-page","text":"","title":"League Administers Page"},{"location":"admin/01-intro/#sd-image","text":"This section show how leage administrators can create their own SD image files.","title":"SD Image"},{"location":"admin/02-sd-image/","text":"Creating a League SD Image Many times teams will not have the time to build their own image during the time allocated for an event. It typically takes 2-4 hours to create a DonkeyCar image that is ready to drive. To get around this problem, leagues frequently create their own \"reference image\" that are given to teams. Checklist for the League Image Bookmark bar in the browser is visible (check Show Bookmarks Bar) Bookmark bar is populated with: You League Homepage (use GitHub Pages and mkdocs for best pratices) Links to Team pages with sample myconfig.py files for each team's car Link to the AI Racing League site (https://www.coderdojotc.org/ai-racing-league/) Links to the DonkeyCar site Links to the Raspberry Pi or NVIDIA Nano site All operating system files updates before match Auto-update disabled - you don't what gigabyte uploads when people insert their image All Python libraries Updates Verify Python release such as Python 3.7 using python --version Run \"pip freeze\" to get a list of the libraries you have tested on All DonkeyCar libraries updated In the \"donkeycar\" repo run a \"git pull\" to update the latest code Make sure you ONLY change the myconfig.py - changes to config.py will be lost ## Things to Remove from your Image Personal information (from your github file in .gitinfo) Change Hostname to be Generic (arl) Remove your home or school default wifi settings Burning an League Reference Image Take the image out of your car Take it to a Mac/PC and copy the image to your harddrive using the dd Command Insert a black MicroSD card Copy the image on your PC's Harddrive to the new MicroSD Using DD or a GUI tool like belana Etcher Using the GNome Partition Editor (gpartd) Reference DonkeyCar Release Process","title":"Custom Club Images"},{"location":"admin/02-sd-image/#creating-a-league-sd-image","text":"Many times teams will not have the time to build their own image during the time allocated for an event. It typically takes 2-4 hours to create a DonkeyCar image that is ready to drive. To get around this problem, leagues frequently create their own \"reference image\" that are given to teams.","title":"Creating a League SD Image"},{"location":"admin/02-sd-image/#checklist-for-the-league-image","text":"Bookmark bar in the browser is visible (check Show Bookmarks Bar) Bookmark bar is populated with: You League Homepage (use GitHub Pages and mkdocs for best pratices) Links to Team pages with sample myconfig.py files for each team's car Link to the AI Racing League site (https://www.coderdojotc.org/ai-racing-league/) Links to the DonkeyCar site Links to the Raspberry Pi or NVIDIA Nano site All operating system files updates before match Auto-update disabled - you don't what gigabyte uploads when people insert their image All Python libraries Updates Verify Python release such as Python 3.7 using python --version Run \"pip freeze\" to get a list of the libraries you have tested on All DonkeyCar libraries updated In the \"donkeycar\" repo run a \"git pull\" to update the latest code Make sure you ONLY change the myconfig.py - changes to config.py will be lost ## Things to Remove from your Image Personal information (from your github file in .gitinfo) Change Hostname to be Generic (arl) Remove your home or school default wifi settings","title":"Checklist for the League Image"},{"location":"admin/02-sd-image/#burning-an-league-reference-image","text":"Take the image out of your car Take it to a Mac/PC and copy the image to your harddrive using the dd Command Insert a black MicroSD card Copy the image on your PC's Harddrive to the new MicroSD Using DD or a GUI tool like belana Etcher","title":"Burning an League Reference Image"},{"location":"admin/02-sd-image/#using-the-gnome-partition-editor-gpartd","text":"","title":"Using the GNome Partition Editor (gpartd)"},{"location":"admin/02-sd-image/#reference","text":"DonkeyCar Release Process","title":"Reference"},{"location":"admin/03-purchasing-guide/","text":"AI Racing League Purchasing Guide DonkeyCars Microcontrollers Raspberry Pi NVIDIA Nano GPUs !!! Note The AI Racing League ONLY uses this for training our models. We don't need elaborate CPU overclocking and a water cooled CPU. We don't need powerful CPU and lots of RAM. We just need to be able to train a 20K image model within around 5-10 minutes. Most GPUs can do this. Portable Case We wanted a small lightweight case with a handle and tempered glass sides so our teams can see what is inside. The price is around $110.00. Lian Li TU150 Mini ITX Desktop Case Motherboard RAM GPU Solid State Drive","title":"Purchasing Guide"},{"location":"admin/03-purchasing-guide/#ai-racing-league-purchasing-guide","text":"","title":"AI Racing League Purchasing Guide"},{"location":"admin/03-purchasing-guide/#donkeycars","text":"","title":"DonkeyCars"},{"location":"admin/03-purchasing-guide/#microcontrollers","text":"","title":"Microcontrollers"},{"location":"admin/03-purchasing-guide/#raspberry-pi","text":"","title":"Raspberry Pi"},{"location":"admin/03-purchasing-guide/#nvidia-nano","text":"","title":"NVIDIA Nano"},{"location":"admin/03-purchasing-guide/#gpus","text":"!!! Note The AI Racing League ONLY uses this for training our models. We don't need elaborate CPU overclocking and a water cooled CPU. We don't need powerful CPU and lots of RAM. We just need to be able to train a 20K image model within around 5-10 minutes. Most GPUs can do this.","title":"GPUs"},{"location":"admin/03-purchasing-guide/#portable-case","text":"We wanted a small lightweight case with a handle and tempered glass sides so our teams can see what is inside. The price is around $110.00. Lian Li TU150 Mini ITX Desktop Case","title":"Portable Case"},{"location":"admin/03-purchasing-guide/#motherboard","text":"","title":"Motherboard"},{"location":"admin/03-purchasing-guide/#ram","text":"","title":"RAM"},{"location":"admin/03-purchasing-guide/#gpu","text":"","title":"GPU"},{"location":"admin/03-purchasing-guide/#solid-state-drive","text":"","title":"Solid State Drive"},{"location":"admin/car-box-checklist/","text":"AI Racing League Car Box Checklist Donkey Car NVIDIA Kit Car Name: _ _ _ _ Mac Address: _ _ _ _ Static IP Address: _ _ _ [ ] RC Car with the following components [ ] RC Car Battery Charger (7.2v NiMh) [ ] Pi Camera Module V2 with 3D printed chassis [ ] 128GB micro SD card (inserted in Nvidia Nano) (2) [ ] RC Car Battery (7.2v NiMh) [ ] Nvidia Nano with 4GB RAM [ ] Ankar 5v 6800mHA battery with charging cable - note draws 900ma when charging so use a 1ft high current USB cable. [ ] 2.5 amp 5v barrel connector for desktop use of Nvidia [ ] Jumper for enabling the barrele connector [ ] WiFi Dongle (plugged into the car) or AC8265 [ ] Logitech F710 Joystick (dongle plugged into the car) - names on both Joystick and dongle [ ] Mouse Optional Accessories (not in the box) 1. [ ] Keyboard 1. [ ] External Monitor Nvidia Nano Serial Number: _ _ _ _____ Nvidia Nano Purchase Date: December 12, 2019 Raspberry Pi DonkeyCar Kit [ ] RC Car with separate ESC and Servo Connectors [ ] RC Car Battery Charger (7.2v NiMh) [ ] 7.2 volt battery with Tamiya connector [ ] 3D Printed Chassis [ ] with 3 large screws for roll-bar to base [ ] 8 smaller screws for attaching the PI and PWM board to base [ ] Raspberry Pi [ ] Board with 4GB RAM [ ] 3A Power with USB C Connector [ ] Keyboard [ ] Mouse [ ] VGA Connector [ ] PWM Board [ ] Camera [ ] 4 Female-Female Dupont Connectors [ ] USB Battery Pack (6,000 to 10,000 milliamp hours) [ ] 1 ft USB A to USB C [ ] Extra 7.2 volt battery for RC Car with mini Tamiya Miscellaneous Parts Digital Volt-Ohm Meter ($10) Extra Tamiya Style Connectors Amazon Link","title":"Car Box Checklist"},{"location":"admin/car-box-checklist/#ai-racing-league-car-box-checklist","text":"","title":"AI Racing League Car Box Checklist"},{"location":"admin/car-box-checklist/#donkey-car-nvidia-kit","text":"Car Name: _ _ _ _ Mac Address: _ _ _ _ Static IP Address: _ _ _ [ ] RC Car with the following components [ ] RC Car Battery Charger (7.2v NiMh) [ ] Pi Camera Module V2 with 3D printed chassis [ ] 128GB micro SD card (inserted in Nvidia Nano) (2) [ ] RC Car Battery (7.2v NiMh) [ ] Nvidia Nano with 4GB RAM [ ] Ankar 5v 6800mHA battery with charging cable - note draws 900ma when charging so use a 1ft high current USB cable. [ ] 2.5 amp 5v barrel connector for desktop use of Nvidia [ ] Jumper for enabling the barrele connector [ ] WiFi Dongle (plugged into the car) or AC8265 [ ] Logitech F710 Joystick (dongle plugged into the car) - names on both Joystick and dongle [ ] Mouse Optional Accessories (not in the box) 1. [ ] Keyboard 1. [ ] External Monitor Nvidia Nano Serial Number: _ _ _ _____ Nvidia Nano Purchase Date: December 12, 2019","title":"Donkey Car NVIDIA Kit"},{"location":"admin/car-box-checklist/#raspberry-pi-donkeycar-kit","text":"[ ] RC Car with separate ESC and Servo Connectors [ ] RC Car Battery Charger (7.2v NiMh) [ ] 7.2 volt battery with Tamiya connector [ ] 3D Printed Chassis [ ] with 3 large screws for roll-bar to base [ ] 8 smaller screws for attaching the PI and PWM board to base [ ] Raspberry Pi [ ] Board with 4GB RAM [ ] 3A Power with USB C Connector [ ] Keyboard [ ] Mouse [ ] VGA Connector [ ] PWM Board [ ] Camera [ ] 4 Female-Female Dupont Connectors [ ] USB Battery Pack (6,000 to 10,000 milliamp hours) [ ] 1 ft USB A to USB C [ ] Extra 7.2 volt battery for RC Car with mini Tamiya","title":"Raspberry Pi DonkeyCar Kit"},{"location":"admin/car-box-checklist/#miscellaneous-parts","text":"Digital Volt-Ohm Meter ($10) Extra Tamiya Style Connectors Amazon Link","title":"Miscellaneous Parts"},{"location":"admin/car-parts-list/","text":"DonkeyCar Nvidia Nano Parts List We have looked at many variations of parts and decided to go with the Nvidia Nano, a TP-Link WiFi dongle and the Logitech F710 Joystick. Here are our recomended parts. We are also looking into getting the wide-angle (160 degree) cameras but we have not tested these enough. Part Name Description Price Link Note 128GB microSD card Samsung 128GB 100MB/s (U3) MicroSDXC Evo Select Memory Card with Adapter (MB-ME128GA/AM) $20 https://www.amazon.com/Samsung-MicroSD-Adapter-MB-ME128GA-AM/dp/B06XWZWYVP MicroCenter in St. Louis Park has these for about 1/2 the prices Camera Raspberry Pi Camera Module V2-8 Megapixel,1080p $30 https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS MUST be Module V2. The V1 will NOT work with the Nano. Dupont Connectors (F-F) EDGELEC 120pcs 20cm Dupont Wire Female to Female Breadboard Jumper Wires 3.9 inch 1pin-1pin 2.54mm Connector Multicolored Ribbon Cables DIY Arduino Wires 10 15 20 30 40 50 100cm Optional $8 for 120 https://www.amazon.com/EDGELEC-Breadboard-1pin-1pin-Connector-Multicolored/dp/B07GCY6CH7 Only need one of these Nvidia Nano Single Board Computer NVIDIA Jetson Nano Developer Kit $99 https://www.amazon.com/NVIDIA-Jetson-Nano-Developer-Kit/dp/B07PZHBDKT Ships in two days Power for Pi - 6700mAh Anker [Upgraded to 6700mAh] Astro E1 Candy-Bar Sized Ultra Compact Portable Charger, External Battery Power Bank, with High-Speed Charging PowerIQ Technology $24 https://www.amazon.com/Anker-Upgraded-Candy-Bar-High-Speed-Technology/dp/B06XS9RMWS I like this one but there are other variations. Some are rated at 10,000 mAh Power Supply for Nano SMAKN DC 5V/4A 20W Switching Power Supply Adapter 100-240 Ac(US) $10 https://www.amazon.com/SMAKN-Switching-Supply-Adapter-100-240/dp/B01N4HYWAM Note that this is a 4A 12V power supply. RC Car 1/16 2.4Ghz Exceed RC Magnet Electric Powered RTR Off Road Truck Stripe Blue NEW $119 https://www.ebay.com/itm/1-16-2-4Ghz-Exceed-RC-Magnet-Electric-Powered-RTR-Off-Road-Truck-Stripe-Blue-NEW/223337258165 E-Bay Wifi USB Dongle N150 USB wireless WiFi network Adapter for PC with SoftAP Mode - Nano Size, Compatible with Linux Kernal 2.6.18~4.4.3 (TL-WN725N) $7 https://www.amazon.com/TP-Link-TL-WN725N-wireless-network-Adapter/dp/B008IFXQFU/ I purchased one at Microcenter and it worked out-of-the-box on the Nano. The Ubuntu drivers are pre-loaded! Servo Module HiLetgo 2pcs PCA9685 16 Channel 12-Bit PWM Servo Motor Driver IIC Module for Arduino Robot $10 for 2 https://www.amazon.com/gp/product/B07BRS249H/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 Note the quantity is 2 USB Power Cable Anker [4-Pack] Powerline Micro USB (1ft) - Charging Cable $10 for 4 https://www.amazon.com/gp/product/B015XR60MQ/ref=ppx_yo_dt_b_asin_title_o02_s00 Note the quantity is 4 but you only need one Replacement Battery 7.2V 1100mAh 6x 2/3A Rechargeable Ni-MH RC Battery Pack w/Small Tamiya Connector 10cmX3cmX1.5cm $9.88 + $2.39 Shipping https://www.ebay.com/i/183877810537 Takes several weeks to ship from China. We are looking for a local supplier. Some replacements (Airsoft guns) have reverse polarity.","title":"Cars Parts List"},{"location":"admin/car-parts-list/#donkeycar-nvidia-nano-parts-list","text":"We have looked at many variations of parts and decided to go with the Nvidia Nano, a TP-Link WiFi dongle and the Logitech F710 Joystick. Here are our recomended parts. We are also looking into getting the wide-angle (160 degree) cameras but we have not tested these enough. Part Name Description Price Link Note 128GB microSD card Samsung 128GB 100MB/s (U3) MicroSDXC Evo Select Memory Card with Adapter (MB-ME128GA/AM) $20 https://www.amazon.com/Samsung-MicroSD-Adapter-MB-ME128GA-AM/dp/B06XWZWYVP MicroCenter in St. Louis Park has these for about 1/2 the prices Camera Raspberry Pi Camera Module V2-8 Megapixel,1080p $30 https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS MUST be Module V2. The V1 will NOT work with the Nano. Dupont Connectors (F-F) EDGELEC 120pcs 20cm Dupont Wire Female to Female Breadboard Jumper Wires 3.9 inch 1pin-1pin 2.54mm Connector Multicolored Ribbon Cables DIY Arduino Wires 10 15 20 30 40 50 100cm Optional $8 for 120 https://www.amazon.com/EDGELEC-Breadboard-1pin-1pin-Connector-Multicolored/dp/B07GCY6CH7 Only need one of these Nvidia Nano Single Board Computer NVIDIA Jetson Nano Developer Kit $99 https://www.amazon.com/NVIDIA-Jetson-Nano-Developer-Kit/dp/B07PZHBDKT Ships in two days Power for Pi - 6700mAh Anker [Upgraded to 6700mAh] Astro E1 Candy-Bar Sized Ultra Compact Portable Charger, External Battery Power Bank, with High-Speed Charging PowerIQ Technology $24 https://www.amazon.com/Anker-Upgraded-Candy-Bar-High-Speed-Technology/dp/B06XS9RMWS I like this one but there are other variations. Some are rated at 10,000 mAh Power Supply for Nano SMAKN DC 5V/4A 20W Switching Power Supply Adapter 100-240 Ac(US) $10 https://www.amazon.com/SMAKN-Switching-Supply-Adapter-100-240/dp/B01N4HYWAM Note that this is a 4A 12V power supply. RC Car 1/16 2.4Ghz Exceed RC Magnet Electric Powered RTR Off Road Truck Stripe Blue NEW $119 https://www.ebay.com/itm/1-16-2-4Ghz-Exceed-RC-Magnet-Electric-Powered-RTR-Off-Road-Truck-Stripe-Blue-NEW/223337258165 E-Bay Wifi USB Dongle N150 USB wireless WiFi network Adapter for PC with SoftAP Mode - Nano Size, Compatible with Linux Kernal 2.6.18~4.4.3 (TL-WN725N) $7 https://www.amazon.com/TP-Link-TL-WN725N-wireless-network-Adapter/dp/B008IFXQFU/ I purchased one at Microcenter and it worked out-of-the-box on the Nano. The Ubuntu drivers are pre-loaded! Servo Module HiLetgo 2pcs PCA9685 16 Channel 12-Bit PWM Servo Motor Driver IIC Module for Arduino Robot $10 for 2 https://www.amazon.com/gp/product/B07BRS249H/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 Note the quantity is 2 USB Power Cable Anker [4-Pack] Powerline Micro USB (1ft) - Charging Cable $10 for 4 https://www.amazon.com/gp/product/B015XR60MQ/ref=ppx_yo_dt_b_asin_title_o02_s00 Note the quantity is 4 but you only need one Replacement Battery 7.2V 1100mAh 6x 2/3A Rechargeable Ni-MH RC Battery Pack w/Small Tamiya Connector 10cmX3cmX1.5cm $9.88 + $2.39 Shipping https://www.ebay.com/i/183877810537 Takes several weeks to ship from China. We are looking for a local supplier. Some replacements (Airsoft guns) have reverse polarity.","title":"DonkeyCar Nvidia Nano Parts List"},{"location":"admin/gpu-parts/","text":"AI Racing League GPU Components Design Goals We wanted to create a local training system that had fast training times but was portable so that we can easily carry it in a car and ship it to remote events. We can't assume any connectivity to the Internet for our events since some of them might be held in parking lots with no network access. Here are our design objectives. We also drive to remote events and the equipment needs to be outside overnight in freezing weather. This rules out using any water-cooled hardware which gets easily damaged in freezing weather. Fast Training Times We want students to be able to drive around a track 20 times (10 times clockwise and 10 times counterclockwise) and generate a reasonable sized data set of 20 frames per second and 224X224 images. This ends up being about 10,000 images. The sizes are a bit larger for larger tracks and slower drivers. Why We Like the NVIDIA RTX 2070 We want to train with this data set in under five minutes. This means that we want to use a GPU card that has about 2000 CUDA cores. An example of this is the Nvidia GeForce GTX graphic cards. The RTX 2070 which currently has a list price of around $500. There are many people that are upgrading their video game systems and are selling these GPUs used on eBay and Craigslist.com for a few hundred dollars. A higher cost option is the NVIDIA RTX 2080 which has a retail list price of around $1,200 USD. The benchmarks for image training for these two boards were done by Dr Donald Kinghorn in March of 2019. [His analysis] (https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/) shows that a single GTX 2080 Ti can process about 293 images per second. The GTX 2070 only does about 191 images per second. But for about 1/3 of the price it is still a good value. Small and Lightweight We originally were \"gifted\" a somewhat old GPU server used in a data center for training deep learning models. Although the sever was \"free\", it was over 70 pounds and had far more capability for RAM and power then we needed at events. Based in this experience we opted to build a much smaller system using a mini enclosure with a handle. We selected the Mini ITX Desktop Case and determined that we could still fit the GPU in this case. Rugged Must be able to take the bumps of shipping and be able to be left out in a car overnight in freezing temperatures. This was a requirement for remote events in rural Minnesota communities. We opted for a full SSD drive to keep the moving parts to a minimum. Easy to ship to remote sites We had to be able to put the unit is a remote shipping case. We are still looking for low-cost cases that are lightweight but protective. Visibility We wanted students to be able to look into the case and see the parts. There is a trend to also purchase RGB LED versions of components which we thought we could program to change from RED to Green during the training process as the model converges. We have not found a good API for the parts so a simple $5 LED strip on a Arduino Nano might be a better idea. See the Moving Rainbow project for sample designs. We create these at the IoT hackthons each year. Sample Parts List 2023 Update PCPartPicker Part List $769 with Monitor by Neal Kelly Part Name Description Price Link CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $95.00 Amazon Motherboard MSI A520M-A PRO Micro ATX AM4 Motherboard $101.11 Amazon Memory Silicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory $23.99 Amazon Storage TEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive $22.49 Amazon Video Card Asus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card $299.99 Amazon Case Thermaltake Versa H18 MicroATX Mini Tower Case $49.99 Amazon Power Supply be quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply $89.69 Amazon Monitor Acer V227Q Abmix 21.5\" 1920 x 1080 75 Hz Monitor $87.29 Amazon Total $769.55 Part Name Description Price Link Note CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $189.99 Motherboard Gigabyte X570 I AORUS PRO WIFI Mini ITX AM4 $219.99 RAM Corsair Vengeance RGB Pro 32 GB (2 x 16 GB) DDR4-3200 Memory $162.99 Link Notes Storage Gigabyte AORUS NVMe Gen4 1 TB M.2-2280 NVME Solid State Drive $209.99 Link Notes Cooling Be quiet! Dark Rock Pro 4, BK022, 250W TDP $89.90 https://www.amazon.com/dp/B07BY6F8D9/ref=cm_sw_r_cp_api_i_PYp-DbFCY51CH Avoid liquid cooler GPU Card NVIDIA GeForce RTX 2070 Ti 8 GB $499.99 https://www.nvidia.com/en-us/geforce/graphics-cards/rtx-2070-super/ $500 price is a lower cost alternative Case Lian Li TU150 Mini ITX Desktop Case $109.99 Link We love the handle on this small case and the glass side panel. Power Supply Corsair SF 600W 80+ Gold SFX Power Supply $114.99 Link 600W is an overkill Note that this motherboard does come with builtin WiFi. The external antenna must be connected but it is easy to get lost in transport. You might want to get a few additional WiFi antennas like these RP-SMA Male Antenna We also think we could get buy with a smaller and lighter power supply, but the 600W model gives the system the opportunity to add external devices that might draw more power. Assembly There are several good videos on YouTube that show how to assemble custom systems. You can also use a search engine to find videos for each of the parts. The Liquid coolers can be tricky to install correctly if you don't have experience. We also recommend reading the user manauals for each of the parts. They are usually on line. Jon Herke's Tiny Monster Installing NVIDIA Drivers on Ubuntu Installing NVIDIA drivers on Ubuntu is notoriously painful and difficult. One mis-step and you can't get to the monitor and have to ssh in to fix things. Make sure to setup ssh before you install the NVIDIA drivers. We used the UNIX command line to install the NVIDIA drivers. The GUI tool on Ubuntu did not work for us in some settings. See NVIDIA Driver Install . A guide to do this is here: Installation of Nvidia Drivers on Ubuntu 18","title":"GPU Parts List"},{"location":"admin/gpu-parts/#ai-racing-league-gpu-components","text":"","title":"AI Racing League GPU Components"},{"location":"admin/gpu-parts/#design-goals","text":"We wanted to create a local training system that had fast training times but was portable so that we can easily carry it in a car and ship it to remote events. We can't assume any connectivity to the Internet for our events since some of them might be held in parking lots with no network access. Here are our design objectives. We also drive to remote events and the equipment needs to be outside overnight in freezing weather. This rules out using any water-cooled hardware which gets easily damaged in freezing weather.","title":"Design Goals"},{"location":"admin/gpu-parts/#fast-training-times","text":"We want students to be able to drive around a track 20 times (10 times clockwise and 10 times counterclockwise) and generate a reasonable sized data set of 20 frames per second and 224X224 images. This ends up being about 10,000 images. The sizes are a bit larger for larger tracks and slower drivers.","title":"Fast Training Times"},{"location":"admin/gpu-parts/#why-we-like-the-nvidia-rtx-2070","text":"We want to train with this data set in under five minutes. This means that we want to use a GPU card that has about 2000 CUDA cores. An example of this is the Nvidia GeForce GTX graphic cards. The RTX 2070 which currently has a list price of around $500. There are many people that are upgrading their video game systems and are selling these GPUs used on eBay and Craigslist.com for a few hundred dollars. A higher cost option is the NVIDIA RTX 2080 which has a retail list price of around $1,200 USD. The benchmarks for image training for these two boards were done by Dr Donald Kinghorn in March of 2019. [His analysis] (https://www.pugetsystems.com/labs/hpc/TensorFlow-Performance-with-1-4-GPUs----RTX-Titan-2080Ti-2080-2070-GTX-1660Ti-1070-1080Ti-and-Titan-V-1386/) shows that a single GTX 2080 Ti can process about 293 images per second. The GTX 2070 only does about 191 images per second. But for about 1/3 of the price it is still a good value.","title":"Why We Like the NVIDIA RTX 2070"},{"location":"admin/gpu-parts/#small-and-lightweight","text":"We originally were \"gifted\" a somewhat old GPU server used in a data center for training deep learning models. Although the sever was \"free\", it was over 70 pounds and had far more capability for RAM and power then we needed at events. Based in this experience we opted to build a much smaller system using a mini enclosure with a handle. We selected the Mini ITX Desktop Case and determined that we could still fit the GPU in this case.","title":"Small and Lightweight"},{"location":"admin/gpu-parts/#rugged","text":"Must be able to take the bumps of shipping and be able to be left out in a car overnight in freezing temperatures. This was a requirement for remote events in rural Minnesota communities. We opted for a full SSD drive to keep the moving parts to a minimum.","title":"Rugged"},{"location":"admin/gpu-parts/#easy-to-ship-to-remote-sites","text":"We had to be able to put the unit is a remote shipping case. We are still looking for low-cost cases that are lightweight but protective.","title":"Easy to ship to remote sites"},{"location":"admin/gpu-parts/#visibility","text":"We wanted students to be able to look into the case and see the parts. There is a trend to also purchase RGB LED versions of components which we thought we could program to change from RED to Green during the training process as the model converges. We have not found a good API for the parts so a simple $5 LED strip on a Arduino Nano might be a better idea. See the Moving Rainbow project for sample designs. We create these at the IoT hackthons each year.","title":"Visibility"},{"location":"admin/gpu-parts/#sample-parts-list","text":"","title":"Sample Parts List"},{"location":"admin/gpu-parts/#2023-update","text":"PCPartPicker Part List $769 with Monitor by Neal Kelly Part Name Description Price Link CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $95.00 Amazon Motherboard MSI A520M-A PRO Micro ATX AM4 Motherboard $101.11 Amazon Memory Silicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory $23.99 Amazon Storage TEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive $22.49 Amazon Video Card Asus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card $299.99 Amazon Case Thermaltake Versa H18 MicroATX Mini Tower Case $49.99 Amazon Power Supply be quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply $89.69 Amazon Monitor Acer V227Q Abmix 21.5\" 1920 x 1080 75 Hz Monitor $87.29 Amazon Total $769.55 Part Name Description Price Link Note CPU AMD Ryzen 5 3600 3.6 GHz 6-Core Processor $189.99 Motherboard Gigabyte X570 I AORUS PRO WIFI Mini ITX AM4 $219.99 RAM Corsair Vengeance RGB Pro 32 GB (2 x 16 GB) DDR4-3200 Memory $162.99 Link Notes Storage Gigabyte AORUS NVMe Gen4 1 TB M.2-2280 NVME Solid State Drive $209.99 Link Notes Cooling Be quiet! Dark Rock Pro 4, BK022, 250W TDP $89.90 https://www.amazon.com/dp/B07BY6F8D9/ref=cm_sw_r_cp_api_i_PYp-DbFCY51CH Avoid liquid cooler GPU Card NVIDIA GeForce RTX 2070 Ti 8 GB $499.99 https://www.nvidia.com/en-us/geforce/graphics-cards/rtx-2070-super/ $500 price is a lower cost alternative Case Lian Li TU150 Mini ITX Desktop Case $109.99 Link We love the handle on this small case and the glass side panel. Power Supply Corsair SF 600W 80+ Gold SFX Power Supply $114.99 Link 600W is an overkill Note that this motherboard does come with builtin WiFi. The external antenna must be connected but it is easy to get lost in transport. You might want to get a few additional WiFi antennas like these RP-SMA Male Antenna We also think we could get buy with a smaller and lighter power supply, but the 600W model gives the system the opportunity to add external devices that might draw more power.","title":"2023 Update"},{"location":"admin/gpu-parts/#assembly","text":"There are several good videos on YouTube that show how to assemble custom systems. You can also use a search engine to find videos for each of the parts. The Liquid coolers can be tricky to install correctly if you don't have experience. We also recommend reading the user manauals for each of the parts. They are usually on line. Jon Herke's Tiny Monster","title":"Assembly"},{"location":"admin/gpu-parts/#installing-nvidia-drivers-on-ubuntu","text":"Installing NVIDIA drivers on Ubuntu is notoriously painful and difficult. One mis-step and you can't get to the monitor and have to ssh in to fix things. Make sure to setup ssh before you install the NVIDIA drivers. We used the UNIX command line to install the NVIDIA drivers. The GUI tool on Ubuntu did not work for us in some settings. See NVIDIA Driver Install . A guide to do this is here: Installation of Nvidia Drivers on Ubuntu 18","title":"Installing NVIDIA Drivers on Ubuntu"},{"location":"admin/gpu-shell/","text":"Shell Commands for the GPU Server The following is a list of shell commands for the AI Racing League GPU Server. We have moved all the commands for setting up the NVIDIA GPU to the file NVIDIA Driver Install . The samples below are run if you are on the GPU running the Terminal shell or you have logged on using the secure shell program. Secure Shell Login ```linenums=\"0\" $ ssh arl@arl1.local 1 2 3 4 ## Check the Version of Ubuntu ```sh $ lsb_release -a Response: 1 2 3 4 5 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic List the CPU Information 1 lscpu Response: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Architecture : x86_64 CPU op - mode ( s ): 32 - bit , 64 - bit Byte Order : Little Endian CPU ( s ): 12 On - line CPU ( s ) list : 0 - 11 Thread ( s ) per core : 2 Core ( s ) per socket : 6 Socket ( s ): 1 NUMA node ( s ): 1 Vendor ID : AuthenticAMD CPU family : 23 Model : 113 Model name : AMD Ryzen 5 3600 6 - Core Processor Stepping : 0 CPU MHz : 2195.902 CPU max MHz : 3600.0000 CPU min MHz : 2200.0000 BogoMIPS : 7187.07 Virtualization : AMD - V L1d cache : 32 K L1i cache : 32 K L2 cache : 512 K L3 cache : 16384 K NUMA node0 CPU ( s ): 0 - 11 Flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3 dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca The key is that we have 12 CPUs and each CPU has two threads. That means that we have 24 threads that run concurrent operations on this server. This is plenty of capacity for our GPU server. RAM 1 free -m Response: 1 2 3 total used free shared buff/cache available Mem: 32124 1627 28879 75 1618 30019 Swap: 2047 0 2047 This indicates we have 32 GB RAM. The GPU server should have a minimum of 8 GB of RAM. Disk Space 1 df -h / Response: 1 2 Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p3 229G 178G 40G 82% / This shows we have a total of 229 gigabytes of RAM and we have 40 gigabytes available. We will need about 4 GB for each training set we store. Per User Disk Usage 1 du -hs /home/* 2 >/dev/null Response: 1 2 3 4 8.5 G / home / arl 1.4 G / home / dan 16 K / home / dan2 155 G / home / donkey Add A New GPU Server User 1 adduser donkey You can also allow the user to have \"sudo\" rights by using the following command: 1 sudo usermod -aG sudo donkey Change the Hostname 1 sudo vi hostname Change the name to \"gpu-server2\" or a similar name. NVIDIA GPU Monitor The runs similar to the UNIX top command, but for the GPU. 1 watch -d -n 0 .5 nvidia-smi NVIDIA GPU Utilization This shows the GPU running at 42% utilization during the training process. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 nvidia-smi Mon Jul 26 20:24:16 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 On | N/A | | 41% 49C P2 136W / 260W | 10892MiB / 11016MiB | 42% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 155MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 32MiB | | 0 N/A N/A 23722 G ...AAAAAAAAA= --shared-files 25MiB | | 0 N/A N/A 27071 G ...AAAAAAAAA= --shared-files 9MiB | | 0 N/A N/A 32486 C ...a3/envs/donkey/bin/python 10571MiB | +-----------------------------------------------------------------------------+","title":"GPU Shell Commands"},{"location":"admin/gpu-shell/#shell-commands-for-the-gpu-server","text":"The following is a list of shell commands for the AI Racing League GPU Server. We have moved all the commands for setting up the NVIDIA GPU to the file NVIDIA Driver Install . The samples below are run if you are on the GPU running the Terminal shell or you have logged on using the secure shell program.","title":"Shell Commands for the GPU Server"},{"location":"admin/gpu-shell/#secure-shell-login","text":"```linenums=\"0\" $ ssh arl@arl1.local 1 2 3 4 ## Check the Version of Ubuntu ```sh $ lsb_release -a Response: 1 2 3 4 5 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic","title":"Secure Shell Login"},{"location":"admin/gpu-shell/#list-the-cpu-information","text":"1 lscpu Response: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Architecture : x86_64 CPU op - mode ( s ): 32 - bit , 64 - bit Byte Order : Little Endian CPU ( s ): 12 On - line CPU ( s ) list : 0 - 11 Thread ( s ) per core : 2 Core ( s ) per socket : 6 Socket ( s ): 1 NUMA node ( s ): 1 Vendor ID : AuthenticAMD CPU family : 23 Model : 113 Model name : AMD Ryzen 5 3600 6 - Core Processor Stepping : 0 CPU MHz : 2195.902 CPU max MHz : 3600.0000 CPU min MHz : 2200.0000 BogoMIPS : 7187.07 Virtualization : AMD - V L1d cache : 32 K L1i cache : 32 K L2 cache : 512 K L3 cache : 16384 K NUMA node0 CPU ( s ): 0 - 11 Flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3 dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate sme ssbd mba sev ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca The key is that we have 12 CPUs and each CPU has two threads. That means that we have 24 threads that run concurrent operations on this server. This is plenty of capacity for our GPU server.","title":"List the CPU Information"},{"location":"admin/gpu-shell/#ram","text":"1 free -m Response: 1 2 3 total used free shared buff/cache available Mem: 32124 1627 28879 75 1618 30019 Swap: 2047 0 2047 This indicates we have 32 GB RAM. The GPU server should have a minimum of 8 GB of RAM.","title":"RAM"},{"location":"admin/gpu-shell/#disk-space","text":"1 df -h / Response: 1 2 Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p3 229G 178G 40G 82% / This shows we have a total of 229 gigabytes of RAM and we have 40 gigabytes available. We will need about 4 GB for each training set we store.","title":"Disk Space"},{"location":"admin/gpu-shell/#per-user-disk-usage","text":"1 du -hs /home/* 2 >/dev/null Response: 1 2 3 4 8.5 G / home / arl 1.4 G / home / dan 16 K / home / dan2 155 G / home / donkey","title":"Per User Disk Usage"},{"location":"admin/gpu-shell/#add-a-new-gpu-server-user","text":"1 adduser donkey You can also allow the user to have \"sudo\" rights by using the following command: 1 sudo usermod -aG sudo donkey","title":"Add A New GPU Server User"},{"location":"admin/gpu-shell/#change-the-hostname","text":"1 sudo vi hostname Change the name to \"gpu-server2\" or a similar name.","title":"Change the Hostname"},{"location":"admin/gpu-shell/#nvidia-gpu-monitor","text":"The runs similar to the UNIX top command, but for the GPU. 1 watch -d -n 0 .5 nvidia-smi","title":"NVIDIA GPU Monitor"},{"location":"admin/gpu-shell/#nvidia-gpu-utilization","text":"This shows the GPU running at 42% utilization during the training process. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 nvidia-smi Mon Jul 26 20:24:16 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 On | N/A | | 41% 49C P2 136W / 260W | 10892MiB / 11016MiB | 42% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 155MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 32MiB | | 0 N/A N/A 23722 G ...AAAAAAAAA= --shared-files 25MiB | | 0 N/A N/A 27071 G ...AAAAAAAAA= --shared-files 9MiB | | 0 N/A N/A 32486 C ...a3/envs/donkey/bin/python 10571MiB | +-----------------------------------------------------------------------------+","title":"NVIDIA GPU Utilization"},{"location":"admin/joystick/","text":"Logitec F710 Game Controller for DonkeyCar https://docs.donkeycar.com/parts/controllers/ Testing to see if the Nano Recognizes the F710 USB Dongle You can use the \"lsusb\" UNIX shell command to list all the USB devices: $ lsusb Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter Bus 001 Device 005: ID 046d:c21f Logitech, Inc. F710 Wireless Gamepad [XInput Mode] Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Note that the USB device with an ID of 046d:c21f has been found in the 4th line above. The first ID before the colon is the device manufacturer (Logiteh) and the second is the id of their device (c21f). Linux looks this number up in their system and then loads the driver for this type of device. The driver will create a device file in the /dev/input directory called js0 $ ls -l /dev/input/js0 crw-rw-r--+ 1 root input 13, 0 Aug 16 19:30 /dev/input/js0 The \"c\" in the first letter says that this is a character I/O device. $ sudo apt-get install evtest [sudo] password for dan: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: apt-clone archdetect-deb bogl-bterm busybox-static cryptsetup-bin dpkg-repack gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common kde-window-manager kinit kio kpackagetool5 kwayland-data kwin-common kwin-data kwin-x11 libdebian-installer4 libkdecorations2-5v5 libkdecorations2private5v5 libkf5activities5 libkf5attica5 libkf5completion-data libkf5completion5 libkf5declarative-data libkf5declarative5 libkf5doctools5 libkf5globalaccel-data libkf5globalaccel5 libkf5globalaccelprivate5 libkf5idletime5 libkf5jobwidgets-data libkf5jobwidgets5 libkf5kcmutils-data libkf5kcmutils5 libkf5kiocore5 libkf5kiontlm5 libkf5kiowidgets5 libkf5newstuff-data libkf5newstuff5 libkf5newstuffcore5 libkf5package-data libkf5package5 libkf5plasma5 libkf5quickaddons5 libkf5solid5 libkf5solid5-data libkf5sonnet5-data libkf5sonnetcore5 libkf5sonnetui5 libkf5textwidgets-data libkf5textwidgets5 libkf5waylandclient5 libkf5waylandserver5 libkf5xmlgui-bin libkf5xmlgui-data libkf5xmlgui5 libkscreenlocker5 libkwin4-effect-builtins1 libkwineffects11 libkwinglutils11 libkwinxrenderutils11 libqgsttools-p1 libqt5designer5 libqt5help5 libqt5multimedia5 libqt5multimedia5-plugins libqt5multimediaquick-p5 libqt5multimediawidgets5 libqt5opengl5 libqt5positioning5 libqt5printsupport5 libqt5qml5 libqt5quick5 libqt5quickwidgets5 libqt5sensors5 libqt5sql5 libqt5test5 libqt5webchannel5 libqt5webkit5 libxcb-composite0 libxcb-cursor0 libxcb-damage0 os-prober python3-dbus.mainloop.pyqt5 python3-icu python3-pam python3-pyqt5 python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-sip qml-module-org-kde-kquickcontrolsaddons qml-module-qtmultimedia qml-module-qtquick2 rdate tasksel tasksel-data Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: evemu-tools libevemu3 The following NEW packages will be installed: evemu-tools evtest libevemu3 0 upgraded, 3 newly installed, 0 to remove and 7 not upgraded. Need to get 38.2 kB of archives. After this operation, 191 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libevemu3 arm64 2.6.0-0.1 [11.0 kB] Get:2 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 evemu-tools arm64 2.6.0-0.1 [12.3 kB] Get:3 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 evtest arm64 1:1.33-1build1 [14.9 kB] Fetched 38.2 kB in 1s (56.1 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libevemu3:arm64. (Reading database ... 140149 files and directories currently installed.) Preparing to unpack .../libevemu3_2.6.0-0.1_arm64.deb ... Unpacking libevemu3:arm64 (2.6.0-0.1) ... Selecting previously unselected package evemu-tools. Preparing to unpack .../evemu-tools_2.6.0-0.1_arm64.deb ... Unpacking evemu-tools (2.6.0-0.1) ... Selecting previously unselected package evtest. Preparing to unpack .../evtest_1%3a1.33-1build1_arm64.deb ... Unpacking evtest (1:1.33-1build1) ... Setting up evtest (1:1.33-1build1) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Setting up libevemu3:arm64 (2.6.0-0.1) ... Setting up evemu-tools (2.6.0-0.1) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... dan@danm-nano:~$ Now run it: $ evtest No device specified, trying to scan all of /dev/input/event* Not running as root, no devices may be available. Available devices: /dev/input/event2: Logitech Gamepad F710 Select the device event number [0-2]: 2 Logitech Gamepad F710 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x46d product 0xc21f version 0x305 Input device name: \"Logitech Gamepad F710\" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 304 (BTN_SOUTH) Event code 305 (BTN_EAST) Event code 307 (BTN_NORTH) Event code 308 (BTN_WEST) Event code 310 (BTN_TL) Event code 311 (BTN_TR) Event code 314 (BTN_SELECT) Event code 315 (BTN_START) Event code 316 (BTN_MODE) Event code 317 (BTN_THUMBL) Event code 318 (BTN_THUMBR) Event type 3 (EV_ABS) Event code 0 (ABS_X) Value 128 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 1 (ABS_Y) Value -129 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 2 (ABS_Z) Value 0 Min 0 Max 255 Event code 3 (ABS_RX) Value 128 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 4 (ABS_RY) Value -129 Min -32768 Max 32767 Fuzz 16 Flat 128 Event code 5 (ABS_RZ) Value 0 Min 0 Max 255 Event code 16 (ABS_HAT0X) Value 0 Min -1 Max 1 Event code 17 (ABS_HAT0Y) Value 0 Min -1 Max 1 Properties: Testing ... (interrupt to exit) Now as you press any key or move any joystick you will see the events. When I press the yellow Y we see: Event: time 1566006064.962158, type 1 (EV_KEY), code 308 (BTN_WEST), value 1 Event: time 1566006064.962158, -------------- SYN_REPORT ------------ Event: time 1566006065.129981, type 1 (EV_KEY), code 308 (BTN_WEST), value 0 Event: time 1566006065.129981, -------------- SYN_REPORT ------------ Blue X Event: time 1566006110.047015, type 1 (EV_KEY), code 307 (BTN_NORTH), value 1 Event: time 1566006110.047015, -------------- SYN_REPORT ------------ Event: time 1566006110.182606, type 1 (EV_KEY), code 307 (BTN_NORTH), value 0 Event: time 1566006110.182606, -------------- SYN_REPORT ------------ Red B Event: time 1566006143.423217, type 1 (EV_KEY), code 305 (BTN_EAST), value 1 Event: time 1566006143.423217, -------------- SYN_REPORT ------------ Event: time 1566006143.499642, type 1 (EV_KEY), code 305 (BTN_EAST), value 0 Event: time 1566006143.499642, -------------- SYN_REPORT ------------ Green A Event: time 1566006184.060282, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 1 Event: time 1566006184.060282, -------------- SYN_REPORT ------------ Event: time 1566006184.128408, type 1 (EV_KEY), code 304 (BTN_SOUTH), value 0 Event: time 1566006184.128408, -------------- SYN_REPORT ------------ Moving the joystick generates: Event: time 1566006255.549652, -------------- SYN_REPORT ------------ Event: time 1566006255.553650, type 3 (EV_ABS), code 1 (ABS_Y), value -10923 Event: time 1566006255.553650, -------------- SYN_REPORT ------------ Event: time 1566006255.557650, type 3 (EV_ABS), code 1 (ABS_Y), value -14264 Event: time 1566006255.557650, -------------- SYN_REPORT ------------ Event: time 1566006255.561652, type 3 (EV_ABS), code 1 (ABS_Y), value -18633","title":"Joystick"},{"location":"admin/nvidia-driver-install/","text":"Install the NVIDIA Driver Ideally you should be able to use the Ubuntu \"Software and Updates\" tool to install the NIVIDA driver. This usually works, but if you get errors, you may need to use the unix shell. NVIDIA Card Verification You can first verify that the GPU card has been installed and powered up. We can use the \"list hardware\" command with the display option: 1 $ sudo lshw -C display 1 2 3 4 5 6 7 8 9 10 11 12 *- display UNCLAIMED description : VGA compatible controller product : GV102 vendor : NVIDIA Corporation physical id : 0 bus info : pci @0000 : 09 : 00.0 version : a1 width : 64 bits clock : 33 MHz capabilities : pm msi pciexpress vga_controller bus_master cap_list configuration : latency = 0 resources : memory : f6000000 - f6ffffff memory : e0000000 - efffffff memory : f0000000 - f1ffffff ioport : e000 ( size = 128 ) memory : c0000 - dffff This shows that there is a GPU card installed but not claimed by the display. NVIDIA Devices You can then use the ubuntu-drivers command to see the devices. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0 == modalias : pci:v000010DEd00001E07sv000010DEsd000012A4bc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-470 - distro non-free recommended driver : nvidia-driver-460-server - distro non-free driver : nvidia-driver-418-server - distro non-free driver : nvidia-driver-460 - distro non-free driver : nvidia-driver-450-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin == /sys/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:04.0/0000:05:00.0 == modalias : pci:v00008086d00002723sv00008086sd00000084bc02sc80i00 vendor : Intel Corporation manual_install: True driver : backport-iwlwifi-dkms - distro free Ubuntu Drivers Autoinstall 1 sudo ubuntu-drivers autoinstall This tool will tell you what drivers you need to install. 1 sudo apt-get install nvidia-driver-470 This will often generate errors but it will indicate what other libraries need to be installed for the 470 driver to work. Final Test Now we are ready to probe the full GPU and get all the statistics of what is in the GPU. 1 nvidia-smi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Thu Jul 22 22:59:36 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 Off | N/A | | 41% 36C P8 2W / 260W | 283MiB / 11016MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 98MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 91MiB | +-----------------------------------------------------------------------------+ If you don't get this or a similar display, you must continue to search for installation instructions. After you get this screen you can reboot. CUDA Version 1 nvcc --version Results: 1 2 3 4 nvcc : NVIDIA ( R ) Cuda compiler driver Copyright ( c ) 2005 - 2017 NVIDIA Corporation Built on Fri_Nov__3_21 : 07 : 56 _CDT_2017 Cuda compilation tools , release 9.1 , V9 . 1.85 CUDA Tookkit Install for PyTorch 1 conda install cudatoolkit = -c pytorch 1 conda install cudatoolkit = 11 -c pytorch","title":"NVIDIA Driver Installation"},{"location":"admin/nvidia-driver-install/#install-the-nvidia-driver","text":"Ideally you should be able to use the Ubuntu \"Software and Updates\" tool to install the NIVIDA driver. This usually works, but if you get errors, you may need to use the unix shell.","title":"Install the NVIDIA Driver"},{"location":"admin/nvidia-driver-install/#nvidia-card-verification","text":"You can first verify that the GPU card has been installed and powered up. We can use the \"list hardware\" command with the display option: 1 $ sudo lshw -C display 1 2 3 4 5 6 7 8 9 10 11 12 *- display UNCLAIMED description : VGA compatible controller product : GV102 vendor : NVIDIA Corporation physical id : 0 bus info : pci @0000 : 09 : 00.0 version : a1 width : 64 bits clock : 33 MHz capabilities : pm msi pciexpress vga_controller bus_master cap_list configuration : latency = 0 resources : memory : f6000000 - f6ffffff memory : e0000000 - efffffff memory : f0000000 - f1ffffff ioport : e000 ( size = 128 ) memory : c0000 - dffff This shows that there is a GPU card installed but not claimed by the display.","title":"NVIDIA Card Verification"},{"location":"admin/nvidia-driver-install/#nvidia-devices","text":"You can then use the ubuntu-drivers command to see the devices. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:03.1/0000:09:00.0 == modalias : pci:v000010DEd00001E07sv000010DEsd000012A4bc03sc00i00 vendor : NVIDIA Corporation driver : nvidia-driver-470 - distro non-free recommended driver : nvidia-driver-460-server - distro non-free driver : nvidia-driver-418-server - distro non-free driver : nvidia-driver-460 - distro non-free driver : nvidia-driver-450-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin == /sys/devices/pci0000:00/0000:00:01.2/0000:02:00.0/0000:03:04.0/0000:05:00.0 == modalias : pci:v00008086d00002723sv00008086sd00000084bc02sc80i00 vendor : Intel Corporation manual_install: True driver : backport-iwlwifi-dkms - distro free","title":"NVIDIA Devices"},{"location":"admin/nvidia-driver-install/#ubuntu-drivers-autoinstall","text":"1 sudo ubuntu-drivers autoinstall This tool will tell you what drivers you need to install. 1 sudo apt-get install nvidia-driver-470 This will often generate errors but it will indicate what other libraries need to be installed for the 470 driver to work.","title":"Ubuntu Drivers Autoinstall"},{"location":"admin/nvidia-driver-install/#final-test","text":"Now we are ready to probe the full GPU and get all the statistics of what is in the GPU. 1 nvidia-smi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Thu Jul 22 22:59:36 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:09:00.0 Off | N/A | | 41% 36C P8 2W / 260W | 283MiB / 11016MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1327 G /usr/lib/xorg/Xorg 18MiB | | 0 N/A N/A 1398 G /usr/bin/gnome-shell 71MiB | | 0 N/A N/A 1574 G /usr/lib/xorg/Xorg 98MiB | | 0 N/A N/A 1705 G /usr/bin/gnome-shell 91MiB | +-----------------------------------------------------------------------------+ If you don't get this or a similar display, you must continue to search for installation instructions. After you get this screen you can reboot.","title":"Final Test"},{"location":"admin/nvidia-driver-install/#cuda-version","text":"1 nvcc --version Results: 1 2 3 4 nvcc : NVIDIA ( R ) Cuda compiler driver Copyright ( c ) 2005 - 2017 NVIDIA Corporation Built on Fri_Nov__3_21 : 07 : 56 _CDT_2017 Cuda compilation tools , release 9.1 , V9 . 1.85","title":"CUDA Version"},{"location":"admin/nvidia-driver-install/#cuda-tookkit-install-for-pytorch","text":"1 conda install cudatoolkit = -c pytorch 1 conda install cudatoolkit = 11 -c pytorch","title":"CUDA Tookkit Install for PyTorch"},{"location":"admin/tensorflow-gpu-install/","text":"$ conda install tensorflow-gpu==2.2.0 Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with flexible solve. Collecting package metadata (repodata.json): done Solving environment: done Package Plan environment location: /home/arl/miniconda3/envs/donkey added / updated specs: - tensorflow-gpu==2.2.0 The following packages will be downloaded: 1 2 3 4 5 6 7 8 9 10 package | build ---------------------------|----------------- cudatoolkit-10.1.243 | h6bb024c_0 347.4 MB cudnn-7.6.5 | cuda10.1_0 179.9 MB cupti-10.1.168 | 0 1.4 MB tensorflow-2.2.0 |gpu_py37h1a511ff_0 4 KB tensorflow-base-2.2.0 |gpu_py37h8a81be8_0 181.7 MB tensorflow-gpu-2.2.0 | h0d30ee6_0 3 KB ------------------------------------------------------------ Total: 710.4 MB The following NEW packages will be INSTALLED: cudatoolkit pkgs/main/linux-64::cudatoolkit-10.1.243-h6bb024c_0 cudnn pkgs/main/linux-64::cudnn-7.6.5-cuda10.1_0 cupti pkgs/main/linux-64::cupti-10.1.168-0 tensorflow-gpu pkgs/main/linux-64::tensorflow-gpu-2.2.0-h0d30ee6_0 The following packages will be DOWNGRADED: _tflow_select 2.3.0-mkl --> 2.1.0-gpu tensorflow 2.2.0-mkl_py37h6e9ce2d_0 --> 2.2.0-gpu_py37h1a511ff_0 tensorflow-base 2.2.0-mkl_py37hd506778_0 --> 2.2.0-gpu_py37h8a81be8_0 Proceed ([y]/n)? Y Downloading and Extracting Packages tensorflow-base-2.2. | 181.7 MB | ################################################################################################################################################################ | 100% cudnn-7.6.5 | 179.9 MB | ################################################################################################################################################################ | 100% cupti-10.1.168 | 1.4 MB | ################################################################################################################################################################ | 100% tensorflow-2.2.0 | 4 KB | ################################################################################################################################################################ | 100% tensorflow-gpu-2.2.0 | 3 KB | ################################################################################################################################################################ | 100% cudatoolkit-10.1.243 | 347.4 MB | ################################################################################################################################################################ | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done","title":"Tensorflow GPU Software"},{"location":"admin/tensorflow-gpu-install/#package-plan","text":"environment location: /home/arl/miniconda3/envs/donkey added / updated specs: - tensorflow-gpu==2.2.0 The following packages will be downloaded: 1 2 3 4 5 6 7 8 9 10 package | build ---------------------------|----------------- cudatoolkit-10.1.243 | h6bb024c_0 347.4 MB cudnn-7.6.5 | cuda10.1_0 179.9 MB cupti-10.1.168 | 0 1.4 MB tensorflow-2.2.0 |gpu_py37h1a511ff_0 4 KB tensorflow-base-2.2.0 |gpu_py37h8a81be8_0 181.7 MB tensorflow-gpu-2.2.0 | h0d30ee6_0 3 KB ------------------------------------------------------------ Total: 710.4 MB The following NEW packages will be INSTALLED: cudatoolkit pkgs/main/linux-64::cudatoolkit-10.1.243-h6bb024c_0 cudnn pkgs/main/linux-64::cudnn-7.6.5-cuda10.1_0 cupti pkgs/main/linux-64::cupti-10.1.168-0 tensorflow-gpu pkgs/main/linux-64::tensorflow-gpu-2.2.0-h0d30ee6_0 The following packages will be DOWNGRADED: _tflow_select 2.3.0-mkl --> 2.1.0-gpu tensorflow 2.2.0-mkl_py37h6e9ce2d_0 --> 2.2.0-gpu_py37h1a511ff_0 tensorflow-base 2.2.0-mkl_py37hd506778_0 --> 2.2.0-gpu_py37h8a81be8_0 Proceed ([y]/n)? Y Downloading and Extracting Packages tensorflow-base-2.2. | 181.7 MB | ################################################################################################################################################################ | 100% cudnn-7.6.5 | 179.9 MB | ################################################################################################################################################################ | 100% cupti-10.1.168 | 1.4 MB | ################################################################################################################################################################ | 100% tensorflow-2.2.0 | 4 KB | ################################################################################################################################################################ | 100% tensorflow-gpu-2.2.0 | 3 KB | ################################################################################################################################################################ | 100% cudatoolkit-10.1.243 | 347.4 MB | ################################################################################################################################################################ | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done","title":"Package Plan"},{"location":"lesson-plans/car-structure/","text":"RC Car Structure Using GPTChat To Help Generate Block Diagrams Generating architecture diagrams can be a slow and painful process. But ChatGPT can help. here is a process of generating a block diagram using ChatGPT. We can use the Mermaid Live program to view the diagram. ChatGPT also has a diagram plugin that will render the image within ChatGPT. GPTChat Prompt ```linenums=\"0\" Create a mermaid block diagram for the structure of a Donkey Car. Make sure to label all the components and their connection types. Return the results in raw mermaid format. Include the following structures: The main computer (Raspberry Pi or NVIDIA Nano) The main computer has an I2C connection to the Servo Controller board The Servo Controller connects to the Steering Servo and the Electronic Speed Controller (ESC) via PWM connections The ESC connects to the RC Car Battery THE ESC connects to the Car Motor The 5v battery powers the main computer There are two batteries: a 5V battery and a 7V RC Car Battery. The Servo controller is a PCA9685 board. 1 ## ChatGPT Response This code will create a block diagram where: The \"Main Computer\" (A) connects to the \"Servo Controller\" (B) via an I2C connection. The \"Servo Controller\" (B) connects to both the \"Steering Servo\" (C) and \"Electronic Speed Controller\" (D) via PWM connections. The \"Electronic Speed Controller\" (D) connects to both the \"RC Car Battery\" (E) and the \"Car Motor\" (F). The \"5V Battery\" (G) connects to the \"Main Computer\" (A) as well as to the \"Positive Connection\" (H) and \"Negative Connection\" (I). The \"RC Car Battery\" (E) also connects to both the \"Positive Connection\" (H) and \"Negative Connection\" (I). Please note that this is a simplified diagram and does not necessarily represent the physical arrangement of the components in an actual Donkey Car setup. This diagram should be taken as an abstract representation of how the components interact. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ## Mermaid Diagram ``` mermaid graph TB A [ \"Main Computer
Raspberry Pi or NVIDIA Nano\" ] B [ \"Servo Controller
PCA9685 board\" ] C [ \"Steering Servo\" ] D [ \"Electronic Speed Controller
(ESC)\" ] E [ \"RC Car Battery (7V)\" ] F [ \"Car Motor\" ] G [ \"5V Battery\" ] A -- I2C --> B B -- PWM --> C B -- PWM --> D D --- E D --- F G --- A","title":"Generating Block Diagrams"},{"location":"lesson-plans/car-structure/#rc-car-structure","text":"","title":"RC Car Structure"},{"location":"lesson-plans/car-structure/#using-gptchat-to-help-generate-block-diagrams","text":"Generating architecture diagrams can be a slow and painful process. But ChatGPT can help. here is a process of generating a block diagram using ChatGPT. We can use the Mermaid Live program to view the diagram. ChatGPT also has a diagram plugin that will render the image within ChatGPT.","title":"Using GPTChat To Help Generate Block Diagrams"},{"location":"lesson-plans/car-structure/#gptchat-prompt","text":"```linenums=\"0\" Create a mermaid block diagram for the structure of a Donkey Car. Make sure to label all the components and their connection types. Return the results in raw mermaid format. Include the following structures: The main computer (Raspberry Pi or NVIDIA Nano) The main computer has an I2C connection to the Servo Controller board The Servo Controller connects to the Steering Servo and the Electronic Speed Controller (ESC) via PWM connections The ESC connects to the RC Car Battery THE ESC connects to the Car Motor The 5v battery powers the main computer There are two batteries: a 5V battery and a 7V RC Car Battery. The Servo controller is a PCA9685 board. 1 ## ChatGPT Response This code will create a block diagram where: The \"Main Computer\" (A) connects to the \"Servo Controller\" (B) via an I2C connection. The \"Servo Controller\" (B) connects to both the \"Steering Servo\" (C) and \"Electronic Speed Controller\" (D) via PWM connections. The \"Electronic Speed Controller\" (D) connects to both the \"RC Car Battery\" (E) and the \"Car Motor\" (F). The \"5V Battery\" (G) connects to the \"Main Computer\" (A) as well as to the \"Positive Connection\" (H) and \"Negative Connection\" (I). The \"RC Car Battery\" (E) also connects to both the \"Positive Connection\" (H) and \"Negative Connection\" (I). Please note that this is a simplified diagram and does not necessarily represent the physical arrangement of the components in an actual Donkey Car setup. This diagram should be taken as an abstract representation of how the components interact. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ## Mermaid Diagram ``` mermaid graph TB A [ \"Main Computer
Raspberry Pi or NVIDIA Nano\" ] B [ \"Servo Controller
PCA9685 board\" ] C [ \"Steering Servo\" ] D [ \"Electronic Speed Controller
(ESC)\" ] E [ \"RC Car Battery (7V)\" ] F [ \"Car Motor\" ] G [ \"5V Battery\" ] A -- I2C --> B B -- PWM --> C B -- PWM --> D D --- E D --- F G --- A","title":"GPTChat Prompt"},{"location":"lesson-plans/computer-vision/","text":"AI Racing League Computer Vision Table Raspberry Pi and the NVIDIA Nano are popular systems for demonstrating various computer vision applications due to their affordability and flexibility. Requirements For these lessons, you just need a Raspberry Pi (or Nano) and the attached Camera that we use for all our cars. Sample Labs Here are several demos we show to high school students using OpenCV and Raspberry Pi: Face Detection and Recognition We can use the built-in Haar cascades in OpenCV for face and eyes detection. For the face recognition part, you can use either OpenCV's built-in algorithms or deep learning-based models such as FaceNet. Object Detection Use pre-trained models from OpenCV's DNN module or TensorFlow's model zoo to recognize multiple objects in real-time. Optical Character Recognition (OCR): Combine OpenCV for image processing and Tesseract for character recognition to demonstrate how a device can read text from images or real-time video feed. Color Detection Write a simple program that detects specific colors in real-time. This can be used as a stepping stone to more advanced object tracking projects. We can also combine this lab with our Raspberry Pi Pico color detection sensors. Motion Detection and Tracking Implement a simple surveillance system that detects motion and tracks moving objects. This can be a good introduction to video analysis. Augmented Reality Show how to overlay graphics on a real-time video feed based on detected features. For example, you can use OpenCV's capabilities for feature detection (like SIFT, SURF, ORB) and perspective transformation to overlay 3D objects on a marker. Hand Gesture Recognition Create a program that recognizes hand gestures and associates them with commands. You could use this to control a game or navigate a user interface. License Plate Recognition You can implement a simple Automatic Number Plate Recognition (ANPR) system using image processing techniques in OpenCV and OCR. QR Code and Barcode Scanner Use OpenCV for real-time detection and decoding of QR codes and barcodes. Most of these demonstrations will require additional Python libraries beyond just OpenCV, like NumPy, Pillow, or TensorFlow. For hardware, you will need the Raspberry Pi 3 with 4GB RAM, a camera module, and potentially additional items like a monitor, mouse, and keyboard for a fully interactive setup.","title":"Computer Vision Labs"},{"location":"lesson-plans/computer-vision/#ai-racing-league-computer-vision-table","text":"Raspberry Pi and the NVIDIA Nano are popular systems for demonstrating various computer vision applications due to their affordability and flexibility.","title":"AI Racing League Computer Vision Table"},{"location":"lesson-plans/computer-vision/#requirements","text":"For these lessons, you just need a Raspberry Pi (or Nano) and the attached Camera that we use for all our cars.","title":"Requirements"},{"location":"lesson-plans/computer-vision/#sample-labs","text":"Here are several demos we show to high school students using OpenCV and Raspberry Pi:","title":"Sample Labs"},{"location":"lesson-plans/computer-vision/#face-detection-and-recognition","text":"We can use the built-in Haar cascades in OpenCV for face and eyes detection. For the face recognition part, you can use either OpenCV's built-in algorithms or deep learning-based models such as FaceNet.","title":"Face Detection and Recognition"},{"location":"lesson-plans/computer-vision/#object-detection","text":"Use pre-trained models from OpenCV's DNN module or TensorFlow's model zoo to recognize multiple objects in real-time.","title":"Object Detection"},{"location":"lesson-plans/computer-vision/#optical-character-recognition-ocr","text":"Combine OpenCV for image processing and Tesseract for character recognition to demonstrate how a device can read text from images or real-time video feed.","title":"Optical Character Recognition (OCR):"},{"location":"lesson-plans/computer-vision/#color-detection","text":"Write a simple program that detects specific colors in real-time. This can be used as a stepping stone to more advanced object tracking projects. We can also combine this lab with our Raspberry Pi Pico color detection sensors.","title":"Color Detection"},{"location":"lesson-plans/computer-vision/#motion-detection-and-tracking","text":"Implement a simple surveillance system that detects motion and tracks moving objects. This can be a good introduction to video analysis.","title":"Motion Detection and Tracking"},{"location":"lesson-plans/computer-vision/#augmented-reality","text":"Show how to overlay graphics on a real-time video feed based on detected features. For example, you can use OpenCV's capabilities for feature detection (like SIFT, SURF, ORB) and perspective transformation to overlay 3D objects on a marker.","title":"Augmented Reality"},{"location":"lesson-plans/computer-vision/#hand-gesture-recognition","text":"Create a program that recognizes hand gestures and associates them with commands. You could use this to control a game or navigate a user interface.","title":"Hand Gesture Recognition"},{"location":"lesson-plans/computer-vision/#license-plate-recognition","text":"You can implement a simple Automatic Number Plate Recognition (ANPR) system using image processing techniques in OpenCV and OCR.","title":"License Plate Recognition"},{"location":"lesson-plans/computer-vision/#qr-code-and-barcode-scanner","text":"Use OpenCV for real-time detection and decoding of QR codes and barcodes. Most of these demonstrations will require additional Python libraries beyond just OpenCV, like NumPy, Pillow, or TensorFlow. For hardware, you will need the Raspberry Pi 3 with 4GB RAM, a camera module, and potentially additional items like a monitor, mouse, and keyboard for a fully interactive setup.","title":"QR Code and Barcode Scanner"},{"location":"lesson-plans/data-analysis/","text":"Data Analysis In these lessons, we learn how to write some basic data analysis Python programs. In the real world, you are often given some data and people ask us \"Tell me what insights you can give me about this data.\" This forms the basis of a field of data science called \"EDA\" for \"Electronic Data Analysis\". For example, say you are on a project to get cars to drive using machine learning. What insights can you derive from the sample images and driving data? Numpy Profiler TBD","title":"Introduction"},{"location":"lesson-plans/data-analysis/#data-analysis","text":"In these lessons, we learn how to write some basic data analysis Python programs. In the real world, you are often given some data and people ask us \"Tell me what insights you can give me about this data.\" This forms the basis of a field of data science called \"EDA\" for \"Electronic Data Analysis\". For example, say you are on a project to get cars to drive using machine learning. What insights can you derive from the sample images and driving data?","title":"Data Analysis"},{"location":"lesson-plans/data-analysis/#numpy-profiler","text":"TBD","title":"Numpy Profiler"},{"location":"lesson-plans/data-analysis/01-intro/","text":"AI Racing League Data Analysis Why Analysis? Data analysis is a core part of building accurate models that create high quality predictions. Here are some sample analytics tasks: Understand what data we have Browse data sets Run metrics that count the number of items in a dataset Open sample items and view sample images Look for groupings of data Look at averages of values Remove poor training data Tools: Python and Jupyter Notebooks Libraries: os, image, numpy, dataframes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Intro Part 2"},{"location":"lesson-plans/data-analysis/01-intro/#ai-racing-league-data-analysis","text":"","title":"AI Racing League Data Analysis"},{"location":"lesson-plans/data-analysis/01-intro/#why-analysis","text":"Data analysis is a core part of building accurate models that create high quality predictions. Here are some sample analytics tasks: Understand what data we have Browse data sets Run metrics that count the number of items in a dataset Open sample items and view sample images Look for groupings of data Look at averages of values Remove poor training data","title":"Why Analysis?"},{"location":"lesson-plans/data-analysis/01-intro/#tools-python-and-jupyter-notebooks","text":"","title":"Tools: Python and Jupyter Notebooks"},{"location":"lesson-plans/data-analysis/01-intro/#libraries-os-image-numpy-dataframes","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Libraries: os, image, numpy, dataframes"},{"location":"lesson-plans/data-analysis/02-listing-files/","text":"Working with Files Listing Files with the OS library Python provides a powerful library for working with Operating System resources like file systems. We will start out with the listdir() function that lists the files in a directory. Here is program that lists all the tub files in our mycar/data directory: 1 2 3 4 5 6 import os data_dir = \"/home/arl/mycar/data/\" files = os . listdir ( data_dir ) for file in files : print ( file ) returns: 1 2 3 4 5 a-test-tub my-test-tub junk-tub production-run tub-47 Listing Files in a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 ) List Random Files In Images Directory 1 2 3 4 5 6 7 8 9 10 import os import matplotlib.pyplot as plt from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" image_file_name_list = os . listdir ( image_dir ) for index in range ( 0 , 10 ): file_name = image_file_name_list [ index ] print ( file_name ) returns: 1 2 3 4 5 6 7 8 9 10 10263 _cam_image_array_ . jpg 6257 _cam_image_array_ . jpg 15248 _cam_image_array_ . jpg 3916 _cam_image_array_ . jpg 5223 _cam_image_array_ . jpg 15765 _cam_image_array_ . jpg 8437 _cam_image_array_ . jpg 5871 _cam_image_array_ . jpg 16681 _cam_image_array_ . jpg 15281 _cam_image_array_ . jpg Note that the files are not in any specific order. Show Images for 10 Random Files 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import glob import matplotlib.pyplot as plt import matplotlib.image as mpimg % matplotlib inline images = [] for img_path in glob . glob ( '/home/arl/mycar/data/dans-msp/data/images/*.jpg' ): images . append ( mpimg . imread ( img_path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image ) Sorting Images By File Name We can add an additional step if we want to sort the images by the file name: 1 2 image_file_name_list = os . listdir ( image_dir ) image_file_name_list . sort () Return Images Based On Creation Date 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import os import matplotlib.pyplot as plt from IPython.display import Image from pathlib import Path image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" paths = sorted ( Path ( image_dir ) . iterdir (), key = os . path . getmtime ) images = [] # just get the first 10 items in the list of images for path in paths [: 10 ]: print ( path ) images . append ( mpimg . imread ( path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Listing Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#working-with-files","text":"","title":"Working with Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#listing-files-with-the-os-library","text":"Python provides a powerful library for working with Operating System resources like file systems. We will start out with the listdir() function that lists the files in a directory. Here is program that lists all the tub files in our mycar/data directory: 1 2 3 4 5 6 import os data_dir = \"/home/arl/mycar/data/\" files = os . listdir ( data_dir ) for file in files : print ( file ) returns: 1 2 3 4 5 a-test-tub my-test-tub junk-tub production-run tub-47","title":"Listing Files with the OS library"},{"location":"lesson-plans/data-analysis/02-listing-files/#listing-files-in-a","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import os from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" files = os . listdir ( image_dir ) # last basement image is 1710 n = 1710 file_n = files [ n ] file_2 = files [ n + 1 ] print ( n , file_n ) file_path1 = image_dir + '/' + file_n file_path2 = image_dir + '/' + file_2 i1 = Image ( file_path1 ) i2 = Image ( file_path2 ) print ( n + 1 , file_2 ) display ( i1 , i2 )","title":"Listing Files in a"},{"location":"lesson-plans/data-analysis/02-listing-files/#list-random-files-in-images-directory","text":"1 2 3 4 5 6 7 8 9 10 import os import matplotlib.pyplot as plt from IPython.display import Image image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" image_file_name_list = os . listdir ( image_dir ) for index in range ( 0 , 10 ): file_name = image_file_name_list [ index ] print ( file_name ) returns: 1 2 3 4 5 6 7 8 9 10 10263 _cam_image_array_ . jpg 6257 _cam_image_array_ . jpg 15248 _cam_image_array_ . jpg 3916 _cam_image_array_ . jpg 5223 _cam_image_array_ . jpg 15765 _cam_image_array_ . jpg 8437 _cam_image_array_ . jpg 5871 _cam_image_array_ . jpg 16681 _cam_image_array_ . jpg 15281 _cam_image_array_ . jpg Note that the files are not in any specific order.","title":"List Random Files In Images Directory"},{"location":"lesson-plans/data-analysis/02-listing-files/#show-images-for-10-random-files","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 import glob import matplotlib.pyplot as plt import matplotlib.image as mpimg % matplotlib inline images = [] for img_path in glob . glob ( '/home/arl/mycar/data/dans-msp/data/images/*.jpg' ): images . append ( mpimg . imread ( img_path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Show Images for 10 Random Files"},{"location":"lesson-plans/data-analysis/02-listing-files/#sorting-images-by-file-name","text":"We can add an additional step if we want to sort the images by the file name: 1 2 image_file_name_list = os . listdir ( image_dir ) image_file_name_list . sort ()","title":"Sorting Images By File Name"},{"location":"lesson-plans/data-analysis/02-listing-files/#return-images-based-on-creation-date","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import os import matplotlib.pyplot as plt from IPython.display import Image from pathlib import Path image_dir = \"/home/arl/mycar/data/dans-msp/data/images\" paths = sorted ( Path ( image_dir ) . iterdir (), key = os . path . getmtime ) images = [] # just get the first 10 items in the list of images for path in paths [: 10 ]: print ( path ) images . append ( mpimg . imread ( path )) plt . figure ( figsize = ( 20 , 10 )) columns = 5 for i , image in enumerate ( images ): plt . subplot ( len ( images ) / columns + 1 , columns , i + 1 ) plt . imshow ( image )","title":"Return Images Based On Creation Date"},{"location":"lesson-plans/data-analysis/03-viewing-images/","text":"Viewing Images Viewing a Single JPG Image","title":"Viewing Images"},{"location":"lesson-plans/data-analysis/03-viewing-images/#viewing-images","text":"","title":"Viewing Images"},{"location":"lesson-plans/data-analysis/03-viewing-images/#viewing-a-single-jpg-image","text":"","title":"Viewing a Single JPG Image"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/","text":"Viewing Catalog Files The data about each image, sometimes called the image \"metadata\", is stored in a file that ends with the file extension .catalog. If you open these files, you will see a simple layout that looks like the following: 1 2 3 {'_index': 16000, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545360, 'cam/image_array': '16000_cam_image_array_.jpg', 'user/angle': 1.0, 'user/mode': 'user', 'user/throttle': 0.5} {'_index': 16001, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545411, 'cam/image_array': '16001_cam_image_array_.jpg', 'user/angle': 0.37, 'user/mode': 'user', 'user/throttle': 0.7} {'_index': 16002, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545460, 'cam/image_array': '16002_cam_image_array_.jpg', 'user/angle': -0.23, 'user/mode': 'user', 'user/throttle': 0.25} This file consists of multiple lines, each line starts and ends with curly braces \"{\" and \"}\". Within these curly braces are a set of key-value pairs where the label is a string in single quotes followed by a colon, the value and a comma. This file uses newlines to separate records and a JSON object format within each single line. Note this is NOT a full JSON file format so you can't just use a standard JSON library to read the catalog file. Here is that format with a the key and value on separate lines to make the line easier to read. 1 2 3 4 5 6 7 8 9 10 { '_i n dex' : 16000 , '_sessio n _id' : ' 21-07-20 _ 0 ' , '_ t imes ta mp_ms' : 1626797545360 , 'cam/image_array' : ' 16000 _cam_image_array_.jpg' , 'user/a n gle' : 1.0 , 'user/mode' : 'user' , 'user/ t hro ttle ' : 0.5 } This format is very similar to a JSON file with the following exceptions: There is no root element to tell us when the JSON file starts and ends There are no commas between the item Here is what a properly formatted JSON file would look like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { \"driveData\" : [ { \"_index\" : 16000 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545360 , \"cam/image_array\" : \"16000_cam_image_array_.jpg\" , \"user/angle\" : 1.0 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.5 }, { \"_index\" : 16001 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545411 , \"cam/image_array\" : \"16001_cam_image_array_.jpg\" , \"user/angle\" : 0.37 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.70 }, { \"_index\" : 16002 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545460 , \"cam/image_array\" : \"16002_cam_image_array_.jpg\" , \"user/angle\" : -0.23 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.25 } ] } Here is a sample JSON file reader that would read this file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.json is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_json_file = script_dir + '/test.json' # Open the JSON test file for read only f = open ( path_to_json_file , 'r' ) # returns JSON object as a dictionary data = json . load ( f ) # Iterating through the json file for the items in the drive data dictionary for i in data [ 'driveData' ]: print ( i ) # Close the JSON file f . close () Note that the open() function reads the file with the \"r\" option which indicates read-only mode. Although this format would make reading the file simple, there are some disadvantages. The key is that individual lines in the new catalog format are atomic units of storage and the files can be easily split and joined using line-by-line tools. Reading Catalog Lines to JSON Objects To read in the values of the catalog file we will open using a line-oriented data structure assuming that there is a newline at the end of each record. We can then just the json library's loads() function which will convert each line to a JSON object. Sample Objects.json file: 1 2 3 4 {\"name\":\"Ann\",\"age\":15} {\"name\":\"Peggy\",\"age\":16} {\"name\":\"Rima\",\"age\":13} {\"name\":\"Sue\",\"age\":14} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import os , json json_file = \"objects.json\" script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/' + json_file f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : line_in_json = json . loads ( line ) count += 1 print ( count , ' ' , end = '' ) print ( line_in_json ) # the result is a Python dictionary print ( line_in_json [ 'name' ]) print ( \"Name:\" , line_to_json [ \"name\" ] ) print ( \"Age:\" , line_to_json [ \"age\" ] ) Returns 1 2 3 4 5 6 7 8 9 10 11 12 1 {' name ' : ' Ann ' , ' age ' : 15 } Name : Ann Age : 15 2 {' name ' : ' Peggy ' , ' age ' : 16 } Name : Peggy Age : 16 3 {' name ' : ' Rima ' , ' age ' : 13 } Name : Rima Age : 13 4 {' name ' : ' Sue ' , ' age ' : 14 } Name : Sue Age : 14 Sample CataLog Reader Program 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 print ( ' \\n\\n line:' , count ) # print(j) print ( \"Index:\" , j [ \"_index\" ] ) print ( \"Session:\" , j [ \"_session_id\" ] ) print ( \"Timestamp:\" , j [ \"_timestamp_ms\" ] ) print ( \"cam/image_array:\" , j [ \"cam/image_array\" ] ) print ( \"user/angle:\" , j [ \"user/angle\" ] ) print ( \"user/mode:\" , j [ \"user/mode\" ] ) print ( \"user/throttle:\" , j [ \"user/throttle\" ] ) returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 line : 1 Index : 16000 Session : 21 - 07 - 20 _0 Timestamp : 1626797545360 cam / image_array : 16000 _cam_image_array_ . jpg user / angle : 1.0 user / mode : user user / throttle : 0.31 line : 2 Index : 16001 Session : 21 - 07 - 20 _0 Timestamp : 1626797545411 cam / image_array : 16001 _cam_image_array_ . jpg user / angle : 0.3715323343607898 user / mode : user user / throttle : 0.31 line : 3 Index : 16002 Session : 21 - 07 - 20 _0 Timestamp : 1626797545460 cam / image_array : 16002 _cam_image_array_ . jpg user / angle : 0.2371288186284982 user / mode : user user / throttle : 0.31 Reference The Python class that creates version 2 of the catalog files is here","title":"Viewing Catalog Files"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#viewing-catalog-files","text":"The data about each image, sometimes called the image \"metadata\", is stored in a file that ends with the file extension .catalog. If you open these files, you will see a simple layout that looks like the following: 1 2 3 {'_index': 16000, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545360, 'cam/image_array': '16000_cam_image_array_.jpg', 'user/angle': 1.0, 'user/mode': 'user', 'user/throttle': 0.5} {'_index': 16001, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545411, 'cam/image_array': '16001_cam_image_array_.jpg', 'user/angle': 0.37, 'user/mode': 'user', 'user/throttle': 0.7} {'_index': 16002, '_session_id': '21-07-20_0', '_timestamp_ms': 1626797545460, 'cam/image_array': '16002_cam_image_array_.jpg', 'user/angle': -0.23, 'user/mode': 'user', 'user/throttle': 0.25} This file consists of multiple lines, each line starts and ends with curly braces \"{\" and \"}\". Within these curly braces are a set of key-value pairs where the label is a string in single quotes followed by a colon, the value and a comma. This file uses newlines to separate records and a JSON object format within each single line. Note this is NOT a full JSON file format so you can't just use a standard JSON library to read the catalog file. Here is that format with a the key and value on separate lines to make the line easier to read. 1 2 3 4 5 6 7 8 9 10 { '_i n dex' : 16000 , '_sessio n _id' : ' 21-07-20 _ 0 ' , '_ t imes ta mp_ms' : 1626797545360 , 'cam/image_array' : ' 16000 _cam_image_array_.jpg' , 'user/a n gle' : 1.0 , 'user/mode' : 'user' , 'user/ t hro ttle ' : 0.5 } This format is very similar to a JSON file with the following exceptions: There is no root element to tell us when the JSON file starts and ends There are no commas between the item Here is what a properly formatted JSON file would look like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { \"driveData\" : [ { \"_index\" : 16000 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545360 , \"cam/image_array\" : \"16000_cam_image_array_.jpg\" , \"user/angle\" : 1.0 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.5 }, { \"_index\" : 16001 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545411 , \"cam/image_array\" : \"16001_cam_image_array_.jpg\" , \"user/angle\" : 0.37 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.70 }, { \"_index\" : 16002 , \"_session_id\" : \"21-07-20_0\" , \"_timestamp_ms\" : 1626797545460 , \"cam/image_array\" : \"16002_cam_image_array_.jpg\" , \"user/angle\" : -0.23 , \"user/mode\" : \"user\" , \"user/throttle\" : 0.25 } ] } Here is a sample JSON file reader that would read this file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.json is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_json_file = script_dir + '/test.json' # Open the JSON test file for read only f = open ( path_to_json_file , 'r' ) # returns JSON object as a dictionary data = json . load ( f ) # Iterating through the json file for the items in the drive data dictionary for i in data [ 'driveData' ]: print ( i ) # Close the JSON file f . close () Note that the open() function reads the file with the \"r\" option which indicates read-only mode. Although this format would make reading the file simple, there are some disadvantages. The key is that individual lines in the new catalog format are atomic units of storage and the files can be easily split and joined using line-by-line tools.","title":"Viewing Catalog Files"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#reading-catalog-lines-to-json-objects","text":"To read in the values of the catalog file we will open using a line-oriented data structure assuming that there is a newline at the end of each record. We can then just the json library's loads() function which will convert each line to a JSON object. Sample Objects.json file: 1 2 3 4 {\"name\":\"Ann\",\"age\":15} {\"name\":\"Peggy\",\"age\":16} {\"name\":\"Rima\",\"age\":13} {\"name\":\"Sue\",\"age\":14} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import os , json json_file = \"objects.json\" script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/' + json_file f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : line_in_json = json . loads ( line ) count += 1 print ( count , ' ' , end = '' ) print ( line_in_json ) # the result is a Python dictionary print ( line_in_json [ 'name' ]) print ( \"Name:\" , line_to_json [ \"name\" ] ) print ( \"Age:\" , line_to_json [ \"age\" ] ) Returns 1 2 3 4 5 6 7 8 9 10 11 12 1 {' name ' : ' Ann ' , ' age ' : 15 } Name : Ann Age : 15 2 {' name ' : ' Peggy ' , ' age ' : 16 } Name : Peggy Age : 16 3 {' name ' : ' Rima ' , ' age ' : 13 } Name : Rima Age : 13 4 {' name ' : ' Sue ' , ' age ' : 14 } Name : Sue Age : 14","title":"Reading Catalog Lines to JSON Objects"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#sample-catalog-reader-program","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () count = 0 # Convert each line to a JSON object for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 print ( ' \\n\\n line:' , count ) # print(j) print ( \"Index:\" , j [ \"_index\" ] ) print ( \"Session:\" , j [ \"_session_id\" ] ) print ( \"Timestamp:\" , j [ \"_timestamp_ms\" ] ) print ( \"cam/image_array:\" , j [ \"cam/image_array\" ] ) print ( \"user/angle:\" , j [ \"user/angle\" ] ) print ( \"user/mode:\" , j [ \"user/mode\" ] ) print ( \"user/throttle:\" , j [ \"user/throttle\" ] ) returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 line : 1 Index : 16000 Session : 21 - 07 - 20 _0 Timestamp : 1626797545360 cam / image_array : 16000 _cam_image_array_ . jpg user / angle : 1.0 user / mode : user user / throttle : 0.31 line : 2 Index : 16001 Session : 21 - 07 - 20 _0 Timestamp : 1626797545411 cam / image_array : 16001 _cam_image_array_ . jpg user / angle : 0.3715323343607898 user / mode : user user / throttle : 0.31 line : 3 Index : 16002 Session : 21 - 07 - 20 _0 Timestamp : 1626797545460 cam / image_array : 16002 _cam_image_array_ . jpg user / angle : 0.2371288186284982 user / mode : user user / throttle : 0.31","title":"Sample CataLog Reader Program"},{"location":"lesson-plans/data-analysis/04-viewing-catalog-files/#reference","text":"The Python class that creates version 2 of the catalog files is here","title":"Reference"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/","text":"Catalog Statistics Now that we know how to reach each item in the tub catalog, we can now do some simple statistics on this data. For example we can calculate the average throttle and steering angle and create some plots of the distribution of these values. Calculating Average Throttle and Angle When we drive around the track each image records both the throttle and steering values at the instant the image was taken by the camera. Although the values sent to the Electronic Speed Controller (ESC) and the servo are unique to every car, instead we store values that have been converted to a range between 0 and 1. Both these values are Normalized to values of between 0 and 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 total_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] print ( count , \"items in dictionary\" ) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) returns: 1 2 3 100 items in dictionary Average throttle : 0.31 Average angle : 0.53 These values look reasonable. Our throttle should be between 0 and 1 and our average steering should be around 0.5. If we drive in a pure circle only in a single direction the average angle will be offset from the 0.5 center value. Viewing Min and Max values 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 min_throttle = 1 max_throttle = 0 total_angle = 0 min_angle = 1 max_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] # check for min and max throttle if j [ \"user/throttle\" ] < min_throttle : min_throttle = j [ \"user/throttle\" ] if j [ \"user/throttle\" ] > max_throttle : max_throttle = j [ \"user/throttle\" ] if j [ \"user/angle\" ] < min_angle : min_angle = j [ \"user/angle\" ] if j [ \"user/angle\" ] > max_angle : max_angle = j [ \"user/angle\" ] print ( ' \\n ' ) print ( count , \"items in catalog\" ) print ( \"Min throttle:\" , round ( min_throttle , 3 )) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Max throttle:\" , round ( max_throttle , 3 )) print ( \"Min angle:\" , round ( min_throttle , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) print ( \"Max angle:\" , round ( max_angle , 3 )) print ( ' \\n ' ) returns: 1 2 3 4 5 6 7 100 items in catalog Min throttle : - 0.31 Average throttle : 0.308 Max throttle : 0.5 Min angle : - 0.31 Average angle : 0.534 Max angle : 1.0 Converting the Dictionary to a DataFrame 1 2 df = pd . DataFrame ( list ( dict . items ())) print ( df ) returns 1 2 3 4 5 6 7 8 0 1 0 _index 16099 1 _session_id 21-07-20_1 2 _timestamp_ms 1626797880229 3 cam/image_array 16099_cam_image_array_.jpg 4 user/angle 0.56914 5 user/mode user 6 user/throttle 0.0632649 Plotting Steering Distributions","title":"Catalog Statistics"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#catalog-statistics","text":"Now that we know how to reach each item in the tub catalog, we can now do some simple statistics on this data. For example we can calculate the average throttle and steering angle and create some plots of the distribution of these values.","title":"Catalog Statistics"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#calculating-average-throttle-and-angle","text":"When we drive around the track each image records both the throttle and steering values at the instant the image was taken by the camera. Although the values sent to the Electronic Speed Controller (ESC) and the servo are unique to every car, instead we store values that have been converted to a range between 0 and 1. Both these values are Normalized to values of between 0 and 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 total_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] print ( count , \"items in dictionary\" ) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) returns: 1 2 3 100 items in dictionary Average throttle : 0.31 Average angle : 0.53 These values look reasonable. Our throttle should be between 0 and 1 and our average steering should be around 0.5. If we drive in a pure circle only in a single direction the average angle will be offset from the 0.5 center value.","title":"Calculating Average Throttle and Angle"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#viewing-min-and-max-values","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 # program to read a DonkeyCar Catalog File import os , json # this program assumes that test.catalog is in the same directory as this script # get the direcotry that this script is running script_dir = os . path . dirname ( __file__ ) # get a relative path to the script dir path_to_catalog_file = script_dir + '/test.catalog' f = open ( path_to_catalog_file ) lines = f . readlines () # create a dictionary object dict = {} count = 0 total_throttle = 0 min_throttle = 1 max_throttle = 0 total_angle = 0 min_angle = 1 max_angle = 0 # Add each line to our dictionary for line in lines : # each line as a JSON dictionary object j = json . loads ( line ) count += 1 dict . update ( json . loads ( line )) total_throttle += j [ \"user/throttle\" ] total_angle += j [ \"user/angle\" ] # check for min and max throttle if j [ \"user/throttle\" ] < min_throttle : min_throttle = j [ \"user/throttle\" ] if j [ \"user/throttle\" ] > max_throttle : max_throttle = j [ \"user/throttle\" ] if j [ \"user/angle\" ] < min_angle : min_angle = j [ \"user/angle\" ] if j [ \"user/angle\" ] > max_angle : max_angle = j [ \"user/angle\" ] print ( ' \\n ' ) print ( count , \"items in catalog\" ) print ( \"Min throttle:\" , round ( min_throttle , 3 )) print ( \"Average throttle: \" , round ( total_throttle / count , 3 )) print ( \"Max throttle:\" , round ( max_throttle , 3 )) print ( \"Min angle:\" , round ( min_throttle , 3 )) print ( \"Average angle:\" , round ( total_angle / count , 3 )) print ( \"Max angle:\" , round ( max_angle , 3 )) print ( ' \\n ' ) returns: 1 2 3 4 5 6 7 100 items in catalog Min throttle : - 0.31 Average throttle : 0.308 Max throttle : 0.5 Min angle : - 0.31 Average angle : 0.534 Max angle : 1.0","title":"Viewing Min and Max values"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#converting-the-dictionary-to-a-dataframe","text":"1 2 df = pd . DataFrame ( list ( dict . items ())) print ( df ) returns 1 2 3 4 5 6 7 8 0 1 0 _index 16099 1 _session_id 21-07-20_1 2 _timestamp_ms 1626797880229 3 cam/image_array 16099_cam_image_array_.jpg 4 user/angle 0.56914 5 user/mode user 6 user/throttle 0.0632649","title":"Converting the Dictionary to a DataFrame"},{"location":"lesson-plans/data-analysis/05-catalog-statistics/#plotting-steering-distributions","text":"","title":"Plotting Steering Distributions"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/","text":"Cleaning Datasets Up until now, we have only been viewing metrics and files. These are all read-only operations. Now we will write our first programs that change the tub datasets. Splitting Datasets In this lab we will assume that we want to break our data into two distinct subsets and place them in different \"tubs\", which are just directories that contain both the catalogs and images for a dataset. You can begin by taking a single dataset in a tub and then duplicating that tub. You can then selectively remove the data from the two tubs to effectively split the tubs. The UNIX shell command to copy an entire directly is the \"cp\" command with the \"-r\" option for recursive copy. 1 cp -r from-dir to-dir You can also add the \"-v\" option to see what files are being copied.","title":"Cleaning Datasets"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/#cleaning-datasets","text":"Up until now, we have only been viewing metrics and files. These are all read-only operations. Now we will write our first programs that change the tub datasets.","title":"Cleaning Datasets"},{"location":"lesson-plans/data-analysis/06-cleaning-datasets/#splitting-datasets","text":"In this lab we will assume that we want to break our data into two distinct subsets and place them in different \"tubs\", which are just directories that contain both the catalogs and images for a dataset. You can begin by taking a single dataset in a tub and then duplicating that tub. You can then selectively remove the data from the two tubs to effectively split the tubs. The UNIX shell command to copy an entire directly is the \"cp\" command with the \"-r\" option for recursive copy. 1 cp -r from-dir to-dir You can also add the \"-v\" option to see what files are being copied.","title":"Splitting Datasets"},{"location":"lesson-plans/jupyter-notebooks/","text":"Introduction to Jupyter Notebooks and Basic Data Analysis Learning Objectives By the end of this lesson, students should be able to: Understand what Jupyter Notebooks are and how to use them effectively. Load and inspect data from CSV and JSON files in a Jupyter Notebook. Perform basic data analysis using Python libraries such as pandas and matplotlib. Apply their knowledge to analyze data from Donkey Car projects. Required Materials and Preparation Access to a computer with Python, Jupyter Notebooks, pandas, and matplotlib installed. Sample data sets from Donkey Car projects in both CSV and JSON formats. Previous knowledge in Python programming. Lesson Breakdown Lesson 1: Introduction to Jupyter Notebooks (2 hours) 1.1 Lecture: What is a Jupyter Notebook? (30 mins) Definition and purpose Features and benefits of using Jupyter Notebooks 1.2 Hands-on Activity: Getting Started with Jupyter Notebook (90 mins) Launching a Jupyter Notebook Familiarizing with the interface Creating, editing, and executing cells Markdown syntax and use Saving and sharing Jupyter Notebooks Lesson 2: Data Loading and Inspection in Jupyter Notebooks (2 hours) 2.1 Lecture: Basics of pandas (30 mins) Overview of pandas Creating dataframes Basic dataframe operations 2.2 Hands-on Activity: Loading and Inspecting Data (90 mins) Reading data from CSV and JSON files with pandas Inspecting data: checking the dimensions, viewing the first/last few rows, data types Data summary statistics: using describe() Lesson 3: Basic Data Analysis in Jupyter Notebooks (3 hours) 3.1 Lecture: Data Analysis with pandas (30 mins) Filtering and selecting data Grouping and aggregation Basic plotting with pandas 3.2 Hands-on Activity: Basic Data Analysis (150 mins) Practical exercises for data selection, filtering, and aggregation Creating basic plots to visualize data insights Exploring the data to answer exploratory questions Lesson 4: Data Analysis of Donkey Car Project Data (3 hours) 4.1 Recap: Overview of the Donkey Car project (30 mins) Overview of the Donkey Car project and the associated datasets 4.2 Hands-on Activity: Donkey Car Data Analysis (150 mins) Loading and inspecting Donkey Car project datasets Performing exploratory data analysis: answering specific questions, making plots, extracting insights Discussion: Sharing insights, potential improvements for the Donkey Car project based on the data Evaluation Students' understanding will be evaluated through their participation in the hands-on activities and the insights they generate from the Donkey Car project's data analysis. An end-of-unit quiz will also be provided to assess their theoretical understanding and practical skills in Jupyter Notebooks and data analysis. Extension Activities Advanced Data Analysis: Introduce students to more advanced data analysis techniques such as correlation analysis, data normalization, and pivot tables. Data Visualization: Teach students about more complex visualizations using libraries such as seaborn or plotly. Machine Learning Introduction: Provide a brief overview of how the data they have analyzed could be used to train a machine learning model.","title":"Jupyter Notebooks"},{"location":"lesson-plans/jupyter-notebooks/#introduction-to-jupyter-notebooks-and-basic-data-analysis","text":"","title":"Introduction to Jupyter Notebooks and Basic Data Analysis"},{"location":"lesson-plans/jupyter-notebooks/#learning-objectives","text":"By the end of this lesson, students should be able to: Understand what Jupyter Notebooks are and how to use them effectively. Load and inspect data from CSV and JSON files in a Jupyter Notebook. Perform basic data analysis using Python libraries such as pandas and matplotlib. Apply their knowledge to analyze data from Donkey Car projects.","title":"Learning Objectives"},{"location":"lesson-plans/jupyter-notebooks/#required-materials-and-preparation","text":"Access to a computer with Python, Jupyter Notebooks, pandas, and matplotlib installed. Sample data sets from Donkey Car projects in both CSV and JSON formats. Previous knowledge in Python programming.","title":"Required Materials and Preparation"},{"location":"lesson-plans/jupyter-notebooks/#lesson-breakdown","text":"Lesson 1: Introduction to Jupyter Notebooks (2 hours) 1.1 Lecture: What is a Jupyter Notebook? (30 mins) Definition and purpose Features and benefits of using Jupyter Notebooks 1.2 Hands-on Activity: Getting Started with Jupyter Notebook (90 mins) Launching a Jupyter Notebook Familiarizing with the interface Creating, editing, and executing cells Markdown syntax and use Saving and sharing Jupyter Notebooks Lesson 2: Data Loading and Inspection in Jupyter Notebooks (2 hours) 2.1 Lecture: Basics of pandas (30 mins) Overview of pandas Creating dataframes Basic dataframe operations 2.2 Hands-on Activity: Loading and Inspecting Data (90 mins) Reading data from CSV and JSON files with pandas Inspecting data: checking the dimensions, viewing the first/last few rows, data types Data summary statistics: using describe() Lesson 3: Basic Data Analysis in Jupyter Notebooks (3 hours) 3.1 Lecture: Data Analysis with pandas (30 mins) Filtering and selecting data Grouping and aggregation Basic plotting with pandas 3.2 Hands-on Activity: Basic Data Analysis (150 mins) Practical exercises for data selection, filtering, and aggregation Creating basic plots to visualize data insights Exploring the data to answer exploratory questions Lesson 4: Data Analysis of Donkey Car Project Data (3 hours) 4.1 Recap: Overview of the Donkey Car project (30 mins) Overview of the Donkey Car project and the associated datasets 4.2 Hands-on Activity: Donkey Car Data Analysis (150 mins) Loading and inspecting Donkey Car project datasets Performing exploratory data analysis: answering specific questions, making plots, extracting insights Discussion: Sharing insights, potential improvements for the Donkey Car project based on the data","title":"Lesson Breakdown"},{"location":"lesson-plans/jupyter-notebooks/#evaluation","text":"Students' understanding will be evaluated through their participation in the hands-on activities and the insights they generate from the Donkey Car project's data analysis. An end-of-unit quiz will also be provided to assess their theoretical understanding and practical skills in Jupyter Notebooks and data analysis.","title":"Evaluation"},{"location":"lesson-plans/jupyter-notebooks/#extension-activities","text":"Advanced Data Analysis: Introduce students to more advanced data analysis techniques such as correlation analysis, data normalization, and pivot tables. Data Visualization: Teach students about more complex visualizations using libraries such as seaborn or plotly. Machine Learning Introduction: Provide a brief overview of how the data they have analyzed could be used to train a machine learning model.","title":"Extension Activities"},{"location":"quizzes/gpu-commands/","text":"","title":"GPU Commands"},{"location":"quizzes/gpu-shell-commands/","text":"GPU Shell Commands Quiz When you use a new GPU server at an AI Racing League event there are many questions you need to have answered about your GPU server. Here is a handy quiz you can use to check your knowledge. The answers to the questions are listed below. Questions Question 1: How would you log into the GPU server using the secure shell program? A) $ login arl@arl1.local B) $ ssh arl@arl1.local C) $ enter arl@arl1.local D) $ connect arl@arl1.local Question 2: How would you check the version of Ubuntu on the GPU server? A) $ version -a B) $ lsb_release -a C) $ ubuntu_version -all D) $ check_ubuntu -a Question 3: What information does the lscpu command provide? A) It provides the CPU information. B) It lists the amount of RAM on the server. C) It checks the disk space. D) It shows per-user disk usage. Question 4: Which command is used to check the total RAM on the GPU server? A) $ free -m B) $ checkram -m C) $ listram -m D) $ raminfo -m Question 5: What does the command df -h / provide? A) It lists per user disk usage. B) It adds a new GPU server user. C) It checks the disk space. D) It monitors the NVIDIA GPU. Question 6: How can a new GPU server user be added? A) $ adduser B) $ newuser C) $ createuser D) $ useradd Question 7: How can you give a user \"sudo\" rights? A) $ sudo usermod -aG sudo B) $ sudo addrights -aG sudo C) $ sudo giverights -aG sudo D) $ sudo addrules -aG sudo Question 8: How can the hostname be changed? A) $ sudo vi hostname B) $ sudo edit hostname C) $ sudo change hostname D) $ sudo alter hostname Question 9: What does the command watch -d -n 0.5 nvidia-smi do? A) It adds a new GPU server user. B) It runs similar to the UNIX top command, but for the GPU. C) It checks the version of Ubuntu. D) It lists the CPU information. Question 10: How would you check the NVIDIA GPU utilization? A) $ checkgpu B) $ nvidia-smi C) $ gpu-utilization D) $ utilization nvidia Answers B) $ ssh arl@arl1.local B) $ lsb_release -a A) It provides the CPU information. A) $ free -m C) It checks the disk space. A) $ adduser A) $ sudo usermod -aG sudo A) $ sudo vi hostname B) It runs similar to the UNIX top command, but for the GPU. B) $ nvidia-smi","title":"GPU Shell Commands Quiz"},{"location":"quizzes/gpu-shell-commands/#gpu-shell-commands-quiz","text":"When you use a new GPU server at an AI Racing League event there are many questions you need to have answered about your GPU server. Here is a handy quiz you can use to check your knowledge. The answers to the questions are listed below.","title":"GPU Shell Commands Quiz"},{"location":"quizzes/gpu-shell-commands/#questions","text":"Question 1: How would you log into the GPU server using the secure shell program? A) $ login arl@arl1.local B) $ ssh arl@arl1.local C) $ enter arl@arl1.local D) $ connect arl@arl1.local Question 2: How would you check the version of Ubuntu on the GPU server? A) $ version -a B) $ lsb_release -a C) $ ubuntu_version -all D) $ check_ubuntu -a Question 3: What information does the lscpu command provide? A) It provides the CPU information. B) It lists the amount of RAM on the server. C) It checks the disk space. D) It shows per-user disk usage. Question 4: Which command is used to check the total RAM on the GPU server? A) $ free -m B) $ checkram -m C) $ listram -m D) $ raminfo -m Question 5: What does the command df -h / provide? A) It lists per user disk usage. B) It adds a new GPU server user. C) It checks the disk space. D) It monitors the NVIDIA GPU. Question 6: How can a new GPU server user be added? A) $ adduser B) $ newuser C) $ createuser D) $ useradd Question 7: How can you give a user \"sudo\" rights? A) $ sudo usermod -aG sudo B) $ sudo addrights -aG sudo C) $ sudo giverights -aG sudo D) $ sudo addrules -aG sudo Question 8: How can the hostname be changed? A) $ sudo vi hostname B) $ sudo edit hostname C) $ sudo change hostname D) $ sudo alter hostname Question 9: What does the command watch -d -n 0.5 nvidia-smi do? A) It adds a new GPU server user. B) It runs similar to the UNIX top command, but for the GPU. C) It checks the version of Ubuntu. D) It lists the CPU information. Question 10: How would you check the NVIDIA GPU utilization? A) $ checkgpu B) $ nvidia-smi C) $ gpu-utilization D) $ utilization nvidia","title":"Questions"},{"location":"quizzes/gpu-shell-commands/#answers","text":"B) $ ssh arl@arl1.local B) $ lsb_release -a A) It provides the CPU information. A) $ free -m C) It checks the disk space. A) $ adduser A) $ sudo usermod -aG sudo A) $ sudo vi hostname B) It runs similar to the UNIX top command, but for the GPU. B) $ nvidia-smi","title":"Answers"},{"location":"setup/battery-options/","text":"Battery Options Getting batteries charged before each event requires some strong organizational skills. Although the LiPo batteries retain a charge for a long time, the RC car batteries must be fully charged the night before each event. Computer Batteries We used several Ankar 2,000 milliamp-hour batteries for powering the cars. The batteries would last for the entire single-day events as long as they were charge before the event and not used to power the cars when not running on the tracks. RC Car Batteries Battery Cables Several participants used long battery cables with a small wire gauge. These cables caused voltage drops that made the cars stop working. We told all teams to use short 8-inch battery cables and most of these problems went away. Sample 1ft Charging Cable","title":"Battery Options"},{"location":"setup/battery-options/#battery-options","text":"Getting batteries charged before each event requires some strong organizational skills. Although the LiPo batteries retain a charge for a long time, the RC car batteries must be fully charged the night before each event.","title":"Battery Options"},{"location":"setup/battery-options/#computer-batteries","text":"We used several Ankar 2,000 milliamp-hour batteries for powering the cars. The batteries would last for the entire single-day events as long as they were charge before the event and not used to power the cars when not running on the tracks.","title":"Computer Batteries"},{"location":"setup/battery-options/#rc-car-batteries","text":"","title":"RC Car Batteries"},{"location":"setup/battery-options/#battery-cables","text":"Several participants used long battery cables with a small wire gauge. These cables caused voltage drops that made the cars stop working. We told all teams to use short 8-inch battery cables and most of these problems went away. Sample 1ft Charging Cable","title":"Battery Cables"},{"location":"setup/calibrate/","text":"Calibrate 1 $ donkey calibrate --channel 0 --bus = 1 Result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... sombrero enabled init PCA9685 on channel 0 address 0x40 bus 1 Using PWM freq : 60 Traceback ( most recent call last ): File \"/home/pi/env/bin/donkey\" , line 33 , in < module > sys . exit ( load_entry_point ( 'donkeycar' , 'console_scripts' , 'donkey' )()) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 500 , in execute_from_command_line c . run ( args [ 2 :]) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 219 , in run c = PCA9685 ( channel , address = address , busnum = busnum , frequency = freq ) File \"/home/pi/projects/donkeycar/donkeycar/parts/actuator.py\" , line 30 , in __init__ self . pwm = Adafruit_PCA9685 . PCA9685 ( address = address ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 75 , in __init__ self . set_all_pwm ( 0 , 0 ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 111 , in set_all_pwm self . _device . write8 ( ALL_LED_ON_L , on & 0xFF ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_GPIO/I2C.py\" , line 114 , in write8 self . _bus . write_byte_data ( self . _address , register , value ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PureIO/smbus.py\" , line 327 , in write_byte_data self . _device . write ( data ) OSError : [ Errno 121 ] Remote I / O error sombrero disabled Diagnostics I2C Detect 1 2 3 4 5 6 7 8 9 10 i2cdetect - y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- I2C Device File 1 2 ls -ld /dev/i2* crw-rw---- 1 root i2c 89, 1 Jul 3 13:17 /dev/i2c-1 I2C Functions Enabled 1 i2cdetect -F 1 returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Functionalities implemented by / dev / i2c - 1 : I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read no SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes Note that both SMBus Block Read and SMBus Block Process Call are set to no. The rest are yes. Upgrade to Python 3.70 1 python3 -m virtualenv -p python3.7 env --system-site-packages 1 2 3 4 5 created virtual environment CPython3 . 7.3 . final . 0 - 32 in 2535 ms creator CPython3Posix ( dest =/ home / pi / env , clear = False , no_vcs_ignore = False , global = True ) seeder FromAppData ( download = False , pip = bundle , setuptools = bundle , wheel = bundle , via = copy , app_data_dir =/ home / pi /. local / share / virtualenv ) added seed packages : pip == 21.1 . 2 , setuptools == 57.0 . 0 , wheel == 0.36 . 2 activators BashActivator , CShellActivator , FishActivator , PowerShellActivator , PythonActivator , XonshActivator 1 python --version 1 Python 3.7.3","title":"Calibrate"},{"location":"setup/calibrate/#calibrate","text":"1 $ donkey calibrate --channel 0 --bus = 1 Result 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... sombrero enabled init PCA9685 on channel 0 address 0x40 bus 1 Using PWM freq : 60 Traceback ( most recent call last ): File \"/home/pi/env/bin/donkey\" , line 33 , in < module > sys . exit ( load_entry_point ( 'donkeycar' , 'console_scripts' , 'donkey' )()) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 500 , in execute_from_command_line c . run ( args [ 2 :]) File \"/home/pi/projects/donkeycar/donkeycar/management/base.py\" , line 219 , in run c = PCA9685 ( channel , address = address , busnum = busnum , frequency = freq ) File \"/home/pi/projects/donkeycar/donkeycar/parts/actuator.py\" , line 30 , in __init__ self . pwm = Adafruit_PCA9685 . PCA9685 ( address = address ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 75 , in __init__ self . set_all_pwm ( 0 , 0 ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PCA9685/PCA9685.py\" , line 111 , in set_all_pwm self . _device . write8 ( ALL_LED_ON_L , on & 0xFF ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_GPIO/I2C.py\" , line 114 , in write8 self . _bus . write_byte_data ( self . _address , register , value ) File \"/home/pi/env/lib/python3.7/site-packages/Adafruit_PureIO/smbus.py\" , line 327 , in write_byte_data self . _device . write ( data ) OSError : [ Errno 121 ] Remote I / O error sombrero disabled","title":"Calibrate"},{"location":"setup/calibrate/#diagnostics","text":"","title":"Diagnostics"},{"location":"setup/calibrate/#i2c-detect","text":"1 2 3 4 5 6 7 8 9 10 i2cdetect - y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- --","title":"I2C Detect"},{"location":"setup/calibrate/#i2c-device-file","text":"1 2 ls -ld /dev/i2* crw-rw---- 1 root i2c 89, 1 Jul 3 13:17 /dev/i2c-1","title":"I2C Device File"},{"location":"setup/calibrate/#i2c-functions-enabled","text":"1 i2cdetect -F 1 returns: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Functionalities implemented by / dev / i2c - 1 : I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read no SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes Note that both SMBus Block Read and SMBus Block Process Call are set to no. The rest are yes.","title":"I2C Functions Enabled"},{"location":"setup/calibrate/#upgrade-to-python-370","text":"1 python3 -m virtualenv -p python3.7 env --system-site-packages 1 2 3 4 5 created virtual environment CPython3 . 7.3 . final . 0 - 32 in 2535 ms creator CPython3Posix ( dest =/ home / pi / env , clear = False , no_vcs_ignore = False , global = True ) seeder FromAppData ( download = False , pip = bundle , setuptools = bundle , wheel = bundle , via = copy , app_data_dir =/ home / pi /. local / share / virtualenv ) added seed packages : pip == 21.1 . 2 , setuptools == 57.0 . 0 , wheel == 0.36 . 2 activators BashActivator , CShellActivator , FishActivator , PowerShellActivator , PythonActivator , XonshActivator 1 python --version 1 Python 3.7.3","title":"Upgrade to Python 3.70"},{"location":"setup/camera-testing/","text":"Testing the Camera To test the camera and cable, we need a command that captures video from a CSI camera connected to an NVIDIA Jetson Nano, converts the video format and resolution, and then displays the video on the screen. We will use the GStreamer command first. GStreamer Test on the Nano 1 $ gst-launch-1.0 nvarguscamerasrc sensor_mode = 0 ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method = 0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e This command is a GStreamer command used to test the functionality of a camera on a NVIDIA Jetson Nano device. GStreamer is a multimedia framework that provides a pipeline for media data. The gst-launch-1.0 utility is used to build and run basic GStreamer pipelines. Here's a breakdown of the command: nvarguscamerasrc sensor_mode=0 : This is a GStreamer plugin specific to the NVIDIA platform that provides support for the Camera Serial Interface (CSI) cameras. sensor_mode=0 indicates that the command should use the first sensor mode of the camera. The sensor mode usually defines properties such as the resolution and frame rate that the camera supports. 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' : This part of the command specifies the desired output from the camera source. The properties indicate that the video should be in NV12 format, with a resolution of 3820x2464 pixels and a frame rate of 21 frames per second. NVMM refers to NVIDIA's proprietary multimedia memory. nvvidconv flip-method=0 : This is another NVIDIA specific GStreamer plugin that converts video from one format to another. The flip-method=0 option means that no flipping operation should be performed on the frames. 'video/x-raw,width=960, height=616' : This specifies the desired output format and resolution after the conversion. The resolution is downscaled to 960x616 pixels. nvvidconv ! nvegltransform ! nveglglessink -e : This part of the pipeline takes the video from the conversion, applies an EGLStream transformation ( nvegltransform ) and then sends it to a EGL/GLES-based render sink ( nveglglessink ). This sink displays the video on the device's screen. The -e flag at the end of the command tells GStreamer to send an end-of-stream signal when the source stops, which will properly close down the pipeline. Why \"!\" and not \"|\"? In the context of a GStreamer command, the \"!\" (aka bang) character is used to connect different elements of a GStreamer pipeline together. It serves a similar role to the UNIX \"|\" (pipe) character in a regular UNIX shell command, where it's used to pipe the output from one command into another. However, there's an important difference between the two. In a UNIX shell command, the | character sends the standard output (stdout) of one command to the standard input (stdin) of another. In a GStreamer pipeline, the ! character doesn't simply pipe data from one element to the next. Instead, it establishes a connection between two GStreamer elements, allowing them to negotiate formats, buffer management, and other details. This negotiation process can involve more complex operations like format conversion, and it happens before any data is actually transferred. So, in summary, while | and ! might seem similar, the latter is used in GStreamer to create more complex, negotiated connections between different multimedia processing elements. Flip Modes The flip-method property of the nvvidconv (NVIDIA Video Converter) plugin controls the orientation of the output video in the NVIDIA Jetson platform. This is useful for handling scenarios where the camera could be mounted in various orientations. Here are the possible values for the flip-method parameter: 0 (Identity) - No rotation, no vertical flip. 1 (Counterclockwise) - Rotate counter-clockwise 90 degrees. 2 (Rotate 180) - Rotate 180 degrees. 3 (Clockwise) - Rotate clockwise 90 degrees. 4 (Horizontal Flip) - Flip horizontally. 5 (Upper Right Diagonal) - Flip across upper right/lower left diagonal. 6 (Vertical Flip) - Flip vertically. 7 (Upper Left Diagonal) - Flip across upper left/lower right diagonal. Each number corresponds to a specific operation on the video frames. The specific operation will be applied to each frame of the video before it's sent to the next element in the GStreamer pipeline. Resources Dan's Blog NVIDIA CSI Camera GitHub Repo Jetson Hacks Blog https://jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/","title":"Camera Testing"},{"location":"setup/camera-testing/#testing-the-camera","text":"To test the camera and cable, we need a command that captures video from a CSI camera connected to an NVIDIA Jetson Nano, converts the video format and resolution, and then displays the video on the screen. We will use the GStreamer command first.","title":"Testing the Camera"},{"location":"setup/camera-testing/#gstreamer-test-on-the-nano","text":"1 $ gst-launch-1.0 nvarguscamerasrc sensor_mode = 0 ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method = 0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e This command is a GStreamer command used to test the functionality of a camera on a NVIDIA Jetson Nano device. GStreamer is a multimedia framework that provides a pipeline for media data. The gst-launch-1.0 utility is used to build and run basic GStreamer pipelines. Here's a breakdown of the command: nvarguscamerasrc sensor_mode=0 : This is a GStreamer plugin specific to the NVIDIA platform that provides support for the Camera Serial Interface (CSI) cameras. sensor_mode=0 indicates that the command should use the first sensor mode of the camera. The sensor mode usually defines properties such as the resolution and frame rate that the camera supports. 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' : This part of the command specifies the desired output from the camera source. The properties indicate that the video should be in NV12 format, with a resolution of 3820x2464 pixels and a frame rate of 21 frames per second. NVMM refers to NVIDIA's proprietary multimedia memory. nvvidconv flip-method=0 : This is another NVIDIA specific GStreamer plugin that converts video from one format to another. The flip-method=0 option means that no flipping operation should be performed on the frames. 'video/x-raw,width=960, height=616' : This specifies the desired output format and resolution after the conversion. The resolution is downscaled to 960x616 pixels. nvvidconv ! nvegltransform ! nveglglessink -e : This part of the pipeline takes the video from the conversion, applies an EGLStream transformation ( nvegltransform ) and then sends it to a EGL/GLES-based render sink ( nveglglessink ). This sink displays the video on the device's screen. The -e flag at the end of the command tells GStreamer to send an end-of-stream signal when the source stops, which will properly close down the pipeline.","title":"GStreamer Test on the Nano"},{"location":"setup/camera-testing/#why-and-not","text":"In the context of a GStreamer command, the \"!\" (aka bang) character is used to connect different elements of a GStreamer pipeline together. It serves a similar role to the UNIX \"|\" (pipe) character in a regular UNIX shell command, where it's used to pipe the output from one command into another. However, there's an important difference between the two. In a UNIX shell command, the | character sends the standard output (stdout) of one command to the standard input (stdin) of another. In a GStreamer pipeline, the ! character doesn't simply pipe data from one element to the next. Instead, it establishes a connection between two GStreamer elements, allowing them to negotiate formats, buffer management, and other details. This negotiation process can involve more complex operations like format conversion, and it happens before any data is actually transferred. So, in summary, while | and ! might seem similar, the latter is used in GStreamer to create more complex, negotiated connections between different multimedia processing elements.","title":"Why \"!\" and not \"|\"?"},{"location":"setup/camera-testing/#flip-modes","text":"The flip-method property of the nvvidconv (NVIDIA Video Converter) plugin controls the orientation of the output video in the NVIDIA Jetson platform. This is useful for handling scenarios where the camera could be mounted in various orientations. Here are the possible values for the flip-method parameter: 0 (Identity) - No rotation, no vertical flip. 1 (Counterclockwise) - Rotate counter-clockwise 90 degrees. 2 (Rotate 180) - Rotate 180 degrees. 3 (Clockwise) - Rotate clockwise 90 degrees. 4 (Horizontal Flip) - Flip horizontally. 5 (Upper Right Diagonal) - Flip across upper right/lower left diagonal. 6 (Vertical Flip) - Flip vertically. 7 (Upper Left Diagonal) - Flip across upper left/lower right diagonal. Each number corresponds to a specific operation on the video frames. The specific operation will be applied to each frame of the video before it's sent to the next element in the GStreamer pipeline.","title":"Flip Modes"},{"location":"setup/camera-testing/#resources","text":"","title":"Resources"},{"location":"setup/camera-testing/#dans-blog","text":"NVIDIA CSI Camera GitHub Repo","title":"Dan's Blog"},{"location":"setup/camera-testing/#jetson-hacks-blog","text":"https://jetsonhacks.com/2019/04/02/jetson-nano-raspberry-pi-camera/","title":"Jetson Hacks Blog"},{"location":"setup/conda-pi-setup/","text":"Raspberry Pi Setup Install Conda for the ARM Processor When asked: Do you wish the installer to prepend the Miniconda3 install location to PATH in your /root/.bashrc? Answer: yes 1 2 3 4 cd /tmp wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh chmod 755 Miniconda3-latest-Linux-armv7l.sh ./Miniconda3-latest-Linux-armv7l.sh Test Conda In Your PATH 1 which conda Should return: 1 /home/pi/miniconda3/bin/conda Add the Raspberry Pi Channel to Conda 1 2 conda config --add channels rpi conda install python = 3 .6 Test Python 1 python --version 1 Python 3.6.6 Create a DonkeyCar Conda Environment 1 conda create --name donkey python = 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 The following NEW packages will be INSTALLED : ca - certificates : 2018.8.24 - 0 rpi certifi : 2018.8.24 - py36_1 rpi ncurses : 6.1 - h4f752ac_1 rpi openssl : 1.0.2 r - hdff2a78_0 rpi pip : 18.0 - py36_1 rpi python : 3.6.6 - hd0568c0_1 rpi readline : 7.0 - hcb560eb_1 rpi setuptools : 40.2.0 - py36_0 rpi sqlite : 3.24.0 - hfcb1bcf_1 rpi tk : 8.6.8 - h849d6a0_0 rpi wheel : 0.31.1 - py36_1 rpi xz : 5.2.4 - hdff2a78_1 rpi zlib : 1.2.11 - hdff2a78_1003 rpi Proceed ( [ y ]/ n ) ? y Add the conda shell to the end of our .bashrc file 1 echo \". /home/pi/miniconda3/etc/profile.d/conda.sh\" >> ~/.bashrc 1 conda activate The shell prompt should now be \"base\" Activate Your Donkey Python Environment 1 source activate donkey You should see the prompt: 1 ( donkey ) pi @myhost : ~ $ Verify Git Is installed 1 git --version git version 2.20.1 Clone the DonkeyCar repository 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar git checkout master 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test Clone DonkeyCar Repo 1 pip freeze certifi==2018.8.24 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar pip install -e . [ pi ]","title":"Setup Conda on Pi"},{"location":"setup/conda-pi-setup/#raspberry-pi-setup","text":"","title":"Raspberry Pi Setup"},{"location":"setup/conda-pi-setup/#install-conda-for-the-arm-processor","text":"When asked: Do you wish the installer to prepend the Miniconda3 install location to PATH in your /root/.bashrc? Answer: yes 1 2 3 4 cd /tmp wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh chmod 755 Miniconda3-latest-Linux-armv7l.sh ./Miniconda3-latest-Linux-armv7l.sh","title":"Install Conda for the ARM Processor"},{"location":"setup/conda-pi-setup/#test-conda-in-your-path","text":"1 which conda Should return: 1 /home/pi/miniconda3/bin/conda","title":"Test Conda In Your PATH"},{"location":"setup/conda-pi-setup/#add-the-raspberry-pi-channel-to-conda","text":"1 2 conda config --add channels rpi conda install python = 3 .6","title":"Add the Raspberry Pi Channel to Conda"},{"location":"setup/conda-pi-setup/#test-python","text":"1 python --version 1 Python 3.6.6","title":"Test Python"},{"location":"setup/conda-pi-setup/#create-a-donkeycar-conda-environment","text":"1 conda create --name donkey python = 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 The following NEW packages will be INSTALLED : ca - certificates : 2018.8.24 - 0 rpi certifi : 2018.8.24 - py36_1 rpi ncurses : 6.1 - h4f752ac_1 rpi openssl : 1.0.2 r - hdff2a78_0 rpi pip : 18.0 - py36_1 rpi python : 3.6.6 - hd0568c0_1 rpi readline : 7.0 - hcb560eb_1 rpi setuptools : 40.2.0 - py36_0 rpi sqlite : 3.24.0 - hfcb1bcf_1 rpi tk : 8.6.8 - h849d6a0_0 rpi wheel : 0.31.1 - py36_1 rpi xz : 5.2.4 - hdff2a78_1 rpi zlib : 1.2.11 - hdff2a78_1003 rpi Proceed ( [ y ]/ n ) ? y","title":"Create a DonkeyCar Conda Environment"},{"location":"setup/conda-pi-setup/#add-the-conda-shell-to-the-end-of-our-bashrc-file","text":"1 echo \". /home/pi/miniconda3/etc/profile.d/conda.sh\" >> ~/.bashrc 1 conda activate The shell prompt should now be \"base\"","title":"Add the conda shell to the end of our .bashrc file"},{"location":"setup/conda-pi-setup/#activate-your-donkey-python-environment","text":"1 source activate donkey You should see the prompt: 1 ( donkey ) pi @myhost : ~ $","title":"Activate Your Donkey Python Environment"},{"location":"setup/conda-pi-setup/#verify-git-is-installed","text":"1 git --version git version 2.20.1","title":"Verify Git Is installed"},{"location":"setup/conda-pi-setup/#clone-the-donkeycar-repository","text":"1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar git checkout master 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"Clone the DonkeyCar repository"},{"location":"setup/conda-pi-setup/#clone-donkeycar-repo","text":"1 pip freeze certifi==2018.8.24 1 2 3 git clone https://github.com/autorope/donkeycar cd donkeycar pip install -e . [ pi ]","title":"Clone DonkeyCar Repo"},{"location":"setup/gpu-options/","text":"GPU Options PCPartPicker Part List: https://pcpartpicker.com/list/mrFYPX CPU: AMD Ryzen 5 3600 3.6 GHz 6-Core Processor ($95.00 @ Amazon) Motherboard: MSI A520M-A PRO Micro ATX AM4 Motherboard ($101.11 @ Amazon) Memory: Silicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory ($23.99 @ Amazon) Storage: TEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive ($22.49 @ Amazon) Video Card: Asus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card ($299.99 @ Amazon) Case: Thermaltake Versa H18 MicroATX Mini Tower Case ($49.99 @ Amazon) Power Supply: be quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply ($89.69 @ Amazon) Monitor: *Acer V227Q Abmix 21.5\" 1920 x 1080 75 Hz Monitor ($87.29 @ Amazon) Total: $769.55","title":"GPU Options"},{"location":"setup/gpu-options/#gpu-options","text":"PCPartPicker Part List: https://pcpartpicker.com/list/mrFYPX CPU: AMD Ryzen 5 3600 3.6 GHz 6-Core Processor ($95.00 @ Amazon) Motherboard: MSI A520M-A PRO Micro ATX AM4 Motherboard ($101.11 @ Amazon) Memory: Silicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory ($23.99 @ Amazon) Storage: TEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive ($22.49 @ Amazon) Video Card: Asus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card ($299.99 @ Amazon) Case: Thermaltake Versa H18 MicroATX Mini Tower Case ($49.99 @ Amazon) Power Supply: be quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply ($89.69 @ Amazon) Monitor: *Acer V227Q Abmix 21.5\" 1920 x 1080 75 Hz Monitor ($87.29 @ Amazon) Total: $769.55","title":"GPU Options"},{"location":"setup/nano-sd-image-checklist/","text":"Nano SD Image Checklist This is a checklist that is genralized for all our events. We can't assume any network connectivity at these events. Required Image is based on the Nvidia Jetson image There is a user \"donkey\" with a password \"car\" The desktop has Chromium and Terminl locked at the top The DonkeyCar Bookmarks are in place The default WiFi is setup and working for the event (use a guest account if we are at company site?) A virtual envinroment is setup and the user is set to that automatically at the end of the .basrc script The Latest DonkeyCar software installed consistently and tested Optional Swap file setup (at least 6 gig) for compiling OpenCV The CSI Camera demo is installed from the Jetson Hacks site to test the camera and do face recognition demos The evtest program in installed to test the Logitech F710 joystick The default config.py and myconfig.py are setup and customized for the CSI camera The default image in the config.py file is 224X224 The \"desktop\" apps (word processing, spreadsheets, presentations) have been removed from the default dock The Chrome browser and the Terminal are on the dock The Chome bookmark bar is enabled (go to the Chrome Settings) The latest version of OpenCV (cv2) is installed, compiled and tested Decent python editor? Jupyter notebook support (arm version!) Sample Jupyter notebooks installed for viewing tub data and cleaning up the tub files (removing data with no speed) Unknowns Can we write a menu-driven UNIX script that will automatically copy tubs to a GPU server and get a model back? Can we assign static IP addresses and names to each car (dk1, dk2, dk3) Can we assume that ALL cars use the same default calibration? Can we write a short test script to verify that all the components are installed and working? What standards should we have for the GPU servers (Ubuntu, not RedHat) What other","title":"Nano SD Image Checklist"},{"location":"setup/nano-sd-image-checklist/#nano-sd-image-checklist","text":"This is a checklist that is genralized for all our events. We can't assume any network connectivity at these events.","title":"Nano SD Image Checklist"},{"location":"setup/nano-sd-image-checklist/#required","text":"Image is based on the Nvidia Jetson image There is a user \"donkey\" with a password \"car\" The desktop has Chromium and Terminl locked at the top The DonkeyCar Bookmarks are in place The default WiFi is setup and working for the event (use a guest account if we are at company site?) A virtual envinroment is setup and the user is set to that automatically at the end of the .basrc script The Latest DonkeyCar software installed consistently and tested","title":"Required"},{"location":"setup/nano-sd-image-checklist/#optional","text":"Swap file setup (at least 6 gig) for compiling OpenCV The CSI Camera demo is installed from the Jetson Hacks site to test the camera and do face recognition demos The evtest program in installed to test the Logitech F710 joystick The default config.py and myconfig.py are setup and customized for the CSI camera The default image in the config.py file is 224X224 The \"desktop\" apps (word processing, spreadsheets, presentations) have been removed from the default dock The Chrome browser and the Terminal are on the dock The Chome bookmark bar is enabled (go to the Chrome Settings) The latest version of OpenCV (cv2) is installed, compiled and tested Decent python editor? Jupyter notebook support (arm version!) Sample Jupyter notebooks installed for viewing tub data and cleaning up the tub files (removing data with no speed)","title":"Optional"},{"location":"setup/nano-sd-image-checklist/#unknowns","text":"Can we write a menu-driven UNIX script that will automatically copy tubs to a GPU server and get a model back? Can we assign static IP addresses and names to each car (dk1, dk2, dk3) Can we assume that ALL cars use the same default calibration? Can we write a short test script to verify that all the components are installed and working? What standards should we have for the GPU servers (Ubuntu, not RedHat) What other","title":"Unknowns"},{"location":"setup/pre-drive-checklist/","text":"DonkeyCar Pre-Drive Checklist Do you have all the software installed correctly? dependencies installed donkey command workings Do you have your PWM Board working? LED light on the PWM card i2cdetect working Battery checks Voltage in the motor battery is 7.2 volts Power level in SBC battery is 100% Configuration File Streering and Throttle calibrated","title":"DonkeyCar Pre-Drive Checklist"},{"location":"setup/pre-drive-checklist/#donkeycar-pre-drive-checklist","text":"Do you have all the software installed correctly? dependencies installed donkey command workings Do you have your PWM Board working? LED light on the PWM card i2cdetect working Battery checks Voltage in the motor battery is 7.2 volts Power level in SBC battery is 100% Configuration File Streering and Throttle calibrated","title":"DonkeyCar Pre-Drive Checklist"},{"location":"setup/pwm-board/","text":"PWM Board Deep Dive The DonkeyCar uses the low cost PCA9685 PWM board. PCA9685 PWM Board Pi 40 Pin Header Connections References Connections Handown (PowerPoint) Using a PCA9685 module with Raspberry Pi","title":"PWM Setup"},{"location":"setup/pwm-board/#pwm-board-deep-dive","text":"The DonkeyCar uses the low cost PCA9685 PWM board.","title":"PWM Board Deep Dive"},{"location":"setup/pwm-board/#pca9685-pwm-board","text":"","title":"PCA9685 PWM Board"},{"location":"setup/pwm-board/#pi-40-pin-header","text":"","title":"Pi 40 Pin Header"},{"location":"setup/pwm-board/#connections","text":"","title":"Connections"},{"location":"setup/pwm-board/#references","text":"Connections Handown (PowerPoint) Using a PCA9685 module with Raspberry Pi","title":"References"},{"location":"setup/software-install-notes/","text":"AI Racing League Software Installation Apt-get Apt-get is the software package installed on the Raspberry Pi OS that allows you to install application libraries. DonkeyCar Libraries (required) 1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp build-essential is the library that tracks software library dependency lists. python3 is the library that runs Python 3. Note that the Raspberry Pi only has Python 2.7 as the default version. All our DonkeyCar software requires Python 3.7. python3-dev includes software development tools to manage python 3. python3-pip is the pip tool that allows you to install a specific version of a python library python-virtualenv is the tool that allows you to setup a virtual environment for the DonkeyCar specific libraries. We use this tool instead of the conda tools. python3-numpy are the numerical procssing python libraries. python3-picamera are the libaries to work with the camera on the Raspberry pi. python3-pandas are tools that allow data access for example reading CSV and JSON files. python2-rpi are python libraries that work with the Raspberry Pi. i2ctools are tools that allow you to work with the I2C communications bus. This is the bus that is used to control the PWM board and which controls the throttle and steering. The other libraries are mostly small support libraries used for supporting debugging. OpenCV (optional) 1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"Software Installation Notes"},{"location":"setup/software-install-notes/#ai-racing-league-software-installation","text":"","title":"AI Racing League Software Installation"},{"location":"setup/software-install-notes/#apt-get","text":"Apt-get is the software package installed on the Raspberry Pi OS that allows you to install application libraries.","title":"Apt-get"},{"location":"setup/software-install-notes/#donkeycar-libraries-required","text":"1 sudo apt-get install build-essential python3 python3-dev python3-pip python3-virtualenv python3-numpy python3-picamera python3-pandas python3-rpi.gpio i2c-tools avahi-utils joystick libopenjp2-7-dev libtiff5-dev gfortran libatlas-base-dev libopenblas-dev libhdf5-serial-dev libgeos-dev git ntp build-essential is the library that tracks software library dependency lists. python3 is the library that runs Python 3. Note that the Raspberry Pi only has Python 2.7 as the default version. All our DonkeyCar software requires Python 3.7. python3-dev includes software development tools to manage python 3. python3-pip is the pip tool that allows you to install a specific version of a python library python-virtualenv is the tool that allows you to setup a virtual environment for the DonkeyCar specific libraries. We use this tool instead of the conda tools. python3-numpy are the numerical procssing python libraries. python3-picamera are the libaries to work with the camera on the Raspberry pi. python3-pandas are tools that allow data access for example reading CSV and JSON files. python2-rpi are python libraries that work with the Raspberry Pi. i2ctools are tools that allow you to work with the I2C communications bus. This is the bus that is used to control the PWM board and which controls the throttle and steering. The other libraries are mostly small support libraries used for supporting debugging.","title":"DonkeyCar Libraries (required)"},{"location":"setup/software-install-notes/#opencv-optional","text":"1 sudo apt-get install libilmbase-dev libopenexr-dev libgstreamer1.0-dev libjasper-dev libwebp-dev libatlas-base-dev libavcodec-dev libavformat-dev libswscale-dev libqtgui4 libqt4-test","title":"OpenCV (optional)"},{"location":"setup/track-options/","text":"Track Options Although you can just put tape down on a floor, that is time-consuming and is often a low-quality track. There are several other options and the prices vary from under $100 to $1,300. In Minnesota, Billboard Tarps sells used vinyl sign material. For around $70 you can get a 16' X 25' used black billboard vinyl sign that is ideal for creating your own track. Billboard Tarps and Vinyl - We suggest you get a dark color (black or dark blue) and then tape down white edges and a yellow dashed line in the center. Picking the Right Size The typical dimensions of a full-event track is 22 x 34 feet. These dimensions are based on the DIYRobocars Standard Track , which is a popular track for donkey car racing. The smaller track is a good option for beginners, as it is easier to navigate and control. The larger track is a better option for experienced drivers, as it offers more challenges and opportunities for speed. Of course, the dimensions of a donkey car track can vary depending on the specific design. However, the dimensions listed above are a good starting point for anyone who is planning to build or race a donkey car. Keeping A Standard Width The standard width of all the \"road\" tracks is two feet or 24 inches. This is the distance to the centerline of the white edges. The roads are typically black with a white edge and a dashed yellow line down the middle of the track. The key is to have a high contrast between the black road and the white edges. Many people use 2\" (or 1 and 7/8\") inch wide duct tape or Gaffers tape. Gaffer's tape is often preferred for temporary events on carpet. Gaffer's tape doesn't harm the surface to which it adhered. Minnesota STEM Partners Tracks Below is a sample of a tarp purchased from Billboard Tarps. Note the actual track is twice this size since it is still folded in half in this photo. Track setup in the driver training room: Note that this track does not adhere to the 2-foot wide rule. This is sometimes done when you have many students doing practice driving on the same track. Optum Track Optum printed their own track on a local printer that specialized in printing large format signage. The custom printing cost was about $1,300.00 Best Buy Track Best Buy also printed its own track for their events. This photo only shows about 1/3 of the track. Dan McCreary's Basement Track This track is just a single piece of white electrical tape. Interlocking Foam Mats You can also purchase interlocking foam mats. These are typically two feet by two feet and cost about $30 for a package of 6. Since each package covers 24 square feet and a full track is about 24x36 feet (758 square feet) we can see the cost of 32 packages is around $960.00. Interlocking Foam Mats From WalMart Amazon Foam Mats References DIYRobocars Standard Track","title":"Track Options"},{"location":"setup/track-options/#track-options","text":"Although you can just put tape down on a floor, that is time-consuming and is often a low-quality track. There are several other options and the prices vary from under $100 to $1,300. In Minnesota, Billboard Tarps sells used vinyl sign material. For around $70 you can get a 16' X 25' used black billboard vinyl sign that is ideal for creating your own track. Billboard Tarps and Vinyl - We suggest you get a dark color (black or dark blue) and then tape down white edges and a yellow dashed line in the center.","title":"Track Options"},{"location":"setup/track-options/#picking-the-right-size","text":"The typical dimensions of a full-event track is 22 x 34 feet. These dimensions are based on the DIYRobocars Standard Track , which is a popular track for donkey car racing. The smaller track is a good option for beginners, as it is easier to navigate and control. The larger track is a better option for experienced drivers, as it offers more challenges and opportunities for speed. Of course, the dimensions of a donkey car track can vary depending on the specific design. However, the dimensions listed above are a good starting point for anyone who is planning to build or race a donkey car.","title":"Picking the Right Size"},{"location":"setup/track-options/#keeping-a-standard-width","text":"The standard width of all the \"road\" tracks is two feet or 24 inches. This is the distance to the centerline of the white edges. The roads are typically black with a white edge and a dashed yellow line down the middle of the track. The key is to have a high contrast between the black road and the white edges. Many people use 2\" (or 1 and 7/8\") inch wide duct tape or Gaffers tape. Gaffer's tape is often preferred for temporary events on carpet. Gaffer's tape doesn't harm the surface to which it adhered.","title":"Keeping A Standard Width"},{"location":"setup/track-options/#minnesota-stem-partners-tracks","text":"Below is a sample of a tarp purchased from Billboard Tarps. Note the actual track is twice this size since it is still folded in half in this photo. Track setup in the driver training room: Note that this track does not adhere to the 2-foot wide rule. This is sometimes done when you have many students doing practice driving on the same track.","title":"Minnesota STEM Partners Tracks"},{"location":"setup/track-options/#optum-track","text":"Optum printed their own track on a local printer that specialized in printing large format signage. The custom printing cost was about $1,300.00","title":"Optum Track"},{"location":"setup/track-options/#best-buy-track","text":"Best Buy also printed its own track for their events. This photo only shows about 1/3 of the track.","title":"Best Buy Track"},{"location":"setup/track-options/#dan-mccrearys-basement-track","text":"This track is just a single piece of white electrical tape.","title":"Dan McCreary's Basement Track"},{"location":"setup/track-options/#interlocking-foam-mats","text":"You can also purchase interlocking foam mats. These are typically two feet by two feet and cost about $30 for a package of 6. Since each package covers 24 square feet and a full track is about 24x36 feet (758 square feet) we can see the cost of 32 packages is around $960.00. Interlocking Foam Mats From WalMart Amazon Foam Mats","title":"Interlocking Foam Mats"},{"location":"setup/track-options/#references","text":"DIYRobocars Standard Track","title":"References"},{"location":"training-logs/dans-basement/","text":"Dans Basement Training Log I have a very small track in my basement. I put down a single white line about 3/4 inch wide using white electrical tape. The background was a marble blue expoy floor with a lot of color variation. The surface was very reflective and there were lights in the ceiling with lots of glare. I drove the car around 10 times in each direction and collected around 4,500 images. Catalogs I manually edited the catlog files and then edited the manifest.json file to modify the paths: 1 {\"paths\": [\"catalog_3.catalog\", \"catalog_4.catalog\", \"catalog_5.catalog\", \"catalog_6.catalog\", \"catalog_7.catalog\"] 1 wc -l data/dans-basement/*.catalog 1 2 3 4 5 6 781 data/dans-basement/catalog_3.catalog 1000 data/dans-basement/catalog_4.catalog 1000 data/dans-basement/catalog_5.catalog 1000 data/dans-basement/catalog_6.catalog 750 data/dans-basement/catalog_7.catalog 4531 total This matched the ls -1 ~/mycar/data/dans-basement/images | wc -l command that counted the number of images. I time the training time on the NIVID RTX 2080 and got the model trained in about 1.5 minutes. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 $ time donkey train -- tub =./ data / dans - basement -- model =./ models / dans - basement . h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 05 : 34.259364 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 05 : 34.278301 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.278898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.279098 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.280320 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.281822 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.282037 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.283140 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.283726 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.285524 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.285676 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286176 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286568 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.286793 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 05 : 34.290920 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 05 : 34.291228 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8a05bbb0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.291241 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 05 : 34.291374 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.291795 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.291830 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.291842 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.291852 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.291862 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.291872 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.291881 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.291891 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.291955 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292398 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292782 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.292805 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.366898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 05 : 34.366930 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 05 : 34.366937 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 05 : 34.367194 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.367855 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368446 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368971 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9911 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 05 : 34.370680 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8bec8fa0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.370693 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / dans - basement / catalog_7 . catalog Records # Training 3364 Records # Validation 842 Epoch 1 / 100 2021 - 07 - 26 21 : 05 : 35.291438 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 35.613762 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 36.322576 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 05 : 36.376195 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 Epoch 00001 : val_loss improved from inf to 0.14744 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 8 s 301 ms / step - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 - val_loss : 0.1474 - val_n_outputs0_loss : 0.1291 - val_n_outputs1_loss : 0.0183 Epoch 2 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 Epoch 00002 : val_loss improved from 0.14744 to 0.09815 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 120 ms / step - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 - val_loss : 0.0981 - val_n_outputs0_loss : 0.0777 - val_n_outputs1_loss : 0.0205 Epoch 3 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 Epoch 00003 : val_loss improved from 0.09815 to 0.07897 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 117 ms / step - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 - val_loss : 0.0790 - val_n_outputs0_loss : 0.0687 - val_n_outputs1_loss : 0.0102 Epoch 4 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 Epoch 00004 : val_loss improved from 0.07897 to 0.07055 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 - val_loss : 0.0705 - val_n_outputs0_loss : 0.0610 - val_n_outputs1_loss : 0.0096 Epoch 5 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 Epoch 00005 : val_loss did not improve from 0.07055 27 / 27 [ ============================== ] - 3 s 105 ms / step - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 - val_loss : 0.0751 - val_n_outputs0_loss : 0.0553 - val_n_outputs1_loss : 0.0198 Epoch 6 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 Epoch 00006 : val_loss improved from 0.07055 to 0.05840 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 - val_loss : 0.0584 - val_n_outputs0_loss : 0.0485 - val_n_outputs1_loss : 0.0099 Epoch 7 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 Epoch 00007 : val_loss improved from 0.05840 to 0.05028 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 - val_loss : 0.0503 - val_n_outputs0_loss : 0.0450 - val_n_outputs1_loss : 0.0053 Epoch 8 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 Epoch 00008 : val_loss improved from 0.05028 to 0.04540 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 - val_loss : 0.0454 - val_n_outputs0_loss : 0.0385 - val_n_outputs1_loss : 0.0069 Epoch 9 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 Epoch 00009 : val_loss improved from 0.04540 to 0.04351 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 - val_loss : 0.0435 - val_n_outputs0_loss : 0.0358 - val_n_outputs1_loss : 0.0077 Epoch 10 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 Epoch 00010 : val_loss improved from 0.04351 to 0.04070 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 - val_loss : 0.0407 - val_n_outputs0_loss : 0.0357 - val_n_outputs1_loss : 0.0050 Epoch 11 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 Epoch 00011 : val_loss improved from 0.04070 to 0.03935 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 109 ms / step - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 - val_loss : 0.0393 - val_n_outputs0_loss : 0.0340 - val_n_outputs1_loss : 0.0054 Epoch 12 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 Epoch 00012 : val_loss improved from 0.03935 to 0.03624 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 - val_loss : 0.0362 - val_n_outputs0_loss : 0.0298 - val_n_outputs1_loss : 0.0065 Epoch 13 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 Epoch 00013 : val_loss improved from 0.03624 to 0.03507 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 - val_loss : 0.0351 - val_n_outputs0_loss : 0.0294 - val_n_outputs1_loss : 0.0057 Epoch 14 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 Epoch 00014 : val_loss improved from 0.03507 to 0.03211 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0265 - val_n_outputs1_loss : 0.0056 Epoch 15 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 Epoch 00015 : val_loss improved from 0.03211 to 0.03208 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0279 - val_n_outputs1_loss : 0.0042 Epoch 16 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 Epoch 00016 : val_loss improved from 0.03208 to 0.02880 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 - val_loss : 0.0288 - val_n_outputs0_loss : 0.0243 - val_n_outputs1_loss : 0.0046 Epoch 17 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 Epoch 00017 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 - val_loss : 0.0322 - val_n_outputs0_loss : 0.0281 - val_n_outputs1_loss : 0.0041 Epoch 18 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 Epoch 00018 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0257 - val_n_outputs1_loss : 0.0036 Epoch 19 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 Epoch 00019 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 - val_loss : 0.0307 - val_n_outputs0_loss : 0.0275 - val_n_outputs1_loss : 0.0032 Epoch 20 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 Epoch 00020 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 - val_loss : 0.0325 - val_n_outputs0_loss : 0.0283 - val_n_outputs1_loss : 0.0042 Epoch 21 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 Epoch 00021 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0258 - val_n_outputs1_loss : 0.0035 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m26 . 930 s user 1 m30 . 911 s sys 0 m42 . 818 s","title":"Dan's Basement"},{"location":"training-logs/dans-basement/#dans-basement-training-log","text":"I have a very small track in my basement. I put down a single white line about 3/4 inch wide using white electrical tape. The background was a marble blue expoy floor with a lot of color variation. The surface was very reflective and there were lights in the ceiling with lots of glare. I drove the car around 10 times in each direction and collected around 4,500 images.","title":"Dans Basement Training Log"},{"location":"training-logs/dans-basement/#catalogs","text":"I manually edited the catlog files and then edited the manifest.json file to modify the paths: 1 {\"paths\": [\"catalog_3.catalog\", \"catalog_4.catalog\", \"catalog_5.catalog\", \"catalog_6.catalog\", \"catalog_7.catalog\"] 1 wc -l data/dans-basement/*.catalog 1 2 3 4 5 6 781 data/dans-basement/catalog_3.catalog 1000 data/dans-basement/catalog_4.catalog 1000 data/dans-basement/catalog_5.catalog 1000 data/dans-basement/catalog_6.catalog 750 data/dans-basement/catalog_7.catalog 4531 total This matched the ls -1 ~/mycar/data/dans-basement/images | wc -l command that counted the number of images. I time the training time on the NIVID RTX 2080 and got the model trained in about 1.5 minutes. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 $ time donkey train -- tub =./ data / dans - basement -- model =./ models / dans - basement . h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 05 : 34.259364 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 05 : 34.278301 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.278898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.279098 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.280320 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.281822 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.282037 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.283140 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.283726 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.285524 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.285676 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286176 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.286568 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.286793 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 05 : 34.290920 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 05 : 34.291228 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8a05bbb0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.291241 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 05 : 34.291374 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.291795 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 05 : 34.291830 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.291842 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 34.291852 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 05 : 34.291862 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 05 : 34.291872 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 05 : 34.291881 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 05 : 34.291891 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 34.291955 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292398 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.292782 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 05 : 34.292805 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 05 : 34.366898 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 05 : 34.366930 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 05 : 34.366937 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 05 : 34.367194 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.367855 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368446 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 05 : 34.368971 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9911 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 05 : 34.370680 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x557d8bec8fa0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 05 : 34.370693 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / dans - basement / catalog_7 . catalog Records # Training 3364 Records # Validation 842 Epoch 1 / 100 2021 - 07 - 26 21 : 05 : 35.291438 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 05 : 35.613762 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 05 : 36.322576 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 05 : 36.376195 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 Epoch 00001 : val_loss improved from inf to 0.14744 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 8 s 301 ms / step - loss : 0.2495 - n_outputs0_loss : 0.1717 - n_outputs1_loss : 0.0778 - val_loss : 0.1474 - val_n_outputs0_loss : 0.1291 - val_n_outputs1_loss : 0.0183 Epoch 2 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 Epoch 00002 : val_loss improved from 0.14744 to 0.09815 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 120 ms / step - loss : 0.1487 - n_outputs0_loss : 0.1265 - n_outputs1_loss : 0.0223 - val_loss : 0.0981 - val_n_outputs0_loss : 0.0777 - val_n_outputs1_loss : 0.0205 Epoch 3 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 Epoch 00003 : val_loss improved from 0.09815 to 0.07897 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 117 ms / step - loss : 0.1075 - n_outputs0_loss : 0.0893 - n_outputs1_loss : 0.0182 - val_loss : 0.0790 - val_n_outputs0_loss : 0.0687 - val_n_outputs1_loss : 0.0102 Epoch 4 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 Epoch 00004 : val_loss improved from 0.07897 to 0.07055 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0917 - n_outputs0_loss : 0.0759 - n_outputs1_loss : 0.0158 - val_loss : 0.0705 - val_n_outputs0_loss : 0.0610 - val_n_outputs1_loss : 0.0096 Epoch 5 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 Epoch 00005 : val_loss did not improve from 0.07055 27 / 27 [ ============================== ] - 3 s 105 ms / step - loss : 0.0880 - n_outputs0_loss : 0.0734 - n_outputs1_loss : 0.0146 - val_loss : 0.0751 - val_n_outputs0_loss : 0.0553 - val_n_outputs1_loss : 0.0198 Epoch 6 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 Epoch 00006 : val_loss improved from 0.07055 to 0.05840 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0757 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0127 - val_loss : 0.0584 - val_n_outputs0_loss : 0.0485 - val_n_outputs1_loss : 0.0099 Epoch 7 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 Epoch 00007 : val_loss improved from 0.05840 to 0.05028 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0672 - n_outputs0_loss : 0.0551 - n_outputs1_loss : 0.0120 - val_loss : 0.0503 - val_n_outputs0_loss : 0.0450 - val_n_outputs1_loss : 0.0053 Epoch 8 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 Epoch 00008 : val_loss improved from 0.05028 to 0.04540 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0621 - n_outputs0_loss : 0.0510 - n_outputs1_loss : 0.0111 - val_loss : 0.0454 - val_n_outputs0_loss : 0.0385 - val_n_outputs1_loss : 0.0069 Epoch 9 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 Epoch 00009 : val_loss improved from 0.04540 to 0.04351 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0545 - n_outputs0_loss : 0.0441 - n_outputs1_loss : 0.0104 - val_loss : 0.0435 - val_n_outputs0_loss : 0.0358 - val_n_outputs1_loss : 0.0077 Epoch 10 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 Epoch 00010 : val_loss improved from 0.04351 to 0.04070 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0558 - n_outputs0_loss : 0.0458 - n_outputs1_loss : 0.0099 - val_loss : 0.0407 - val_n_outputs0_loss : 0.0357 - val_n_outputs1_loss : 0.0050 Epoch 11 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 Epoch 00011 : val_loss improved from 0.04070 to 0.03935 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 109 ms / step - loss : 0.0505 - n_outputs0_loss : 0.0415 - n_outputs1_loss : 0.0090 - val_loss : 0.0393 - val_n_outputs0_loss : 0.0340 - val_n_outputs1_loss : 0.0054 Epoch 12 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 Epoch 00012 : val_loss improved from 0.03935 to 0.03624 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0476 - n_outputs0_loss : 0.0388 - n_outputs1_loss : 0.0088 - val_loss : 0.0362 - val_n_outputs0_loss : 0.0298 - val_n_outputs1_loss : 0.0065 Epoch 13 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 Epoch 00013 : val_loss improved from 0.03624 to 0.03507 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0453 - n_outputs0_loss : 0.0373 - n_outputs1_loss : 0.0080 - val_loss : 0.0351 - val_n_outputs0_loss : 0.0294 - val_n_outputs1_loss : 0.0057 Epoch 14 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 Epoch 00014 : val_loss improved from 0.03507 to 0.03211 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 111 ms / step - loss : 0.0430 - n_outputs0_loss : 0.0352 - n_outputs1_loss : 0.0079 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0265 - val_n_outputs1_loss : 0.0056 Epoch 15 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 Epoch 00015 : val_loss improved from 0.03211 to 0.03208 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 110 ms / step - loss : 0.0397 - n_outputs0_loss : 0.0327 - n_outputs1_loss : 0.0070 - val_loss : 0.0321 - val_n_outputs0_loss : 0.0279 - val_n_outputs1_loss : 0.0042 Epoch 16 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 Epoch 00016 : val_loss improved from 0.03208 to 0.02880 , saving model to ./ models / dans - basement . h5 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0382 - n_outputs0_loss : 0.0316 - n_outputs1_loss : 0.0065 - val_loss : 0.0288 - val_n_outputs0_loss : 0.0243 - val_n_outputs1_loss : 0.0046 Epoch 17 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 Epoch 00017 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0381 - n_outputs0_loss : 0.0313 - n_outputs1_loss : 0.0069 - val_loss : 0.0322 - val_n_outputs0_loss : 0.0281 - val_n_outputs1_loss : 0.0041 Epoch 18 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 Epoch 00018 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0375 - n_outputs0_loss : 0.0310 - n_outputs1_loss : 0.0065 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0257 - val_n_outputs1_loss : 0.0036 Epoch 19 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 Epoch 00019 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 108 ms / step - loss : 0.0372 - n_outputs0_loss : 0.0308 - n_outputs1_loss : 0.0064 - val_loss : 0.0307 - val_n_outputs0_loss : 0.0275 - val_n_outputs1_loss : 0.0032 Epoch 20 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 Epoch 00020 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 104 ms / step - loss : 0.0347 - n_outputs0_loss : 0.0285 - n_outputs1_loss : 0.0062 - val_loss : 0.0325 - val_n_outputs0_loss : 0.0283 - val_n_outputs1_loss : 0.0042 Epoch 21 / 100 27 / 27 [ ============================== ] - ETA : 0 s - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 Epoch 00021 : val_loss did not improve from 0.02880 27 / 27 [ ============================== ] - 3 s 107 ms / step - loss : 0.0349 - n_outputs0_loss : 0.0290 - n_outputs1_loss : 0.0058 - val_loss : 0.0293 - val_n_outputs0_loss : 0.0258 - val_n_outputs1_loss : 0.0035 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m26 . 930 s user 1 m30 . 911 s sys 0 m42 . 818 s","title":"Catalogs"},{"location":"training-logs/msp-1-cpu/","text":"Training Log for MSP Car #1 After cleanup we only got about 1,500 records. But here is a log of the training. It took about 1.5 minutes. 1 $ donkey train --tub = ./data/msp-car-1 --model = ./models/msp-car-1.f5 _ ______ _________ _ _ _ _ / _ _/ __ _ _ / / / _ _ // / _ _ / / / _ / _ `/ / _ / / // / / / / / / ,< / / / / / / / / / / / / / _ / _ // / / // /| | ___/ _ , / ____/ _ , / / / /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021-07-26 19:50:45.562205: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021-07-26 19:50:45.565106: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3592950000 Hz 2021-07-26 19:50:45.565470: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d85e9d19f0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-07-26 19:50:45.565492: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-07-26 19:50:45.565578: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance. Model: \"model\" Layer (type) Output Shape Param # Connected to img_in (InputLayer) [(None, 224, 224, 3) 0 conv2d_1 (Conv2D) (None, 110, 110, 24) 1824 img_in[0][0] dropout (Dropout) (None, 110, 110, 24) 0 conv2d_1[0][0] conv2d_2 (Conv2D) (None, 53, 53, 32) 19232 dropout[0][0] dropout_1 (Dropout) (None, 53, 53, 32) 0 conv2d_2[0][0] conv2d_3 (Conv2D) (None, 25, 25, 64) 51264 dropout_1[0][0] dropout_2 (Dropout) (None, 25, 25, 64) 0 conv2d_3[0][0] conv2d_4 (Conv2D) (None, 23, 23, 64) 36928 dropout_2[0][0] dropout_3 (Dropout) (None, 23, 23, 64) 0 conv2d_4[0][0] conv2d_5 (Conv2D) (None, 21, 21, 64) 36928 dropout_3[0][0] dropout_4 (Dropout) (None, 21, 21, 64) 0 conv2d_5[0][0] flattened (Flatten) (None, 28224) 0 dropout_4[0][0] dense_1 (Dense) (None, 100) 2822500 flattened[0][0] dropout_5 (Dropout) (None, 100) 0 dense_1[0][0] dense_2 (Dense) (None, 50) 5050 dropout_5[0][0] dropout_6 (Dropout) (None, 50) 0 dense_2[0][0] n_outputs0 (Dense) (None, 1) 51 dropout_6[0][0] n_outputs1 (Dense) (None, 1) 51 dropout_6[0][0] Total params: 2,973,828 Trainable params: 2,973,828 Non-trainable params: 0 None Using catalog /home/arl/mycar/data/msp-car-1/catalog_17.catalog Records # Training 1265 Records # Validation 317 Epoch 1/100 10/10 [==============================] - ETA: 0s - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 Epoch 00001: val_loss improved from inf to 0.54341, saving model to ./models/msp-car-1.f5 2021-07-26 19:50:57.881390: W tensorflow/python/util/util.cc:329] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. WARNING:tensorflow:From /home/arl/miniconda3/envs/donkey/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable. init (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 10/10 [==============================] - 11s 1s/step - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 - val_loss: 0.5434 - val_n_outputs0_loss: 0.4668 - val_n_outputs1_loss: 0.0767 Epoch 2/100 10/10 [==============================] - ETA: 0s - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 Epoch 00002: val_loss improved from 0.54341 to 0.53272, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 - val_loss: 0.5327 - val_n_outputs0_loss: 0.4605 - val_n_outputs1_loss: 0.0722 Epoch 3/100 10/10 [==============================] - ETA: 0s - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 Epoch 00003: val_loss improved from 0.53272 to 0.50775, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 - val_loss: 0.5077 - val_n_outputs0_loss: 0.4551 - val_n_outputs1_loss: 0.0527 Epoch 4/100 10/10 [==============================] - ETA: 0s - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 Epoch 00004: val_loss improved from 0.50775 to 0.49783, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 - val_loss: 0.4978 - val_n_outputs0_loss: 0.4455 - val_n_outputs1_loss: 0.0523 Epoch 5/100 10/10 [==============================] - ETA: 0s - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 Epoch 00005: val_loss improved from 0.49783 to 0.49721, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 - val_loss: 0.4972 - val_n_outputs0_loss: 0.4451 - val_n_outputs1_loss: 0.0521 Epoch 6/100 10/10 [==============================] - ETA: 0s - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 Epoch 00006: val_loss did not improve from 0.49721 10/10 [==============================] - 9s 934ms/step - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 - val_loss: 0.4981 - val_n_outputs0_loss: 0.4461 - val_n_outputs1_loss: 0.0520 Epoch 7/100 10/10 [==============================] - ETA: 0s - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 Epoch 00007: val_loss improved from 0.49721 to 0.49668, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 - val_loss: 0.4967 - val_n_outputs0_loss: 0.4442 - val_n_outputs1_loss: 0.0525 Epoch 8/100 10/10 [==============================] - ETA: 0s - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 Epoch 00008: val_loss improved from 0.49668 to 0.49536, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 - val_loss: 0.4954 - val_n_outputs0_loss: 0.4408 - val_n_outputs1_loss: 0.0546 Epoch 9/100 10/10 [==============================] - ETA: 0s - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 Epoch 00009: val_loss improved from 0.49536 to 0.48741, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 - val_loss: 0.4874 - val_n_outputs0_loss: 0.4353 - val_n_outputs1_loss: 0.0521 Epoch 10/100 10/10 [==============================] - ETA: 0s - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 Epoch 00010: val_loss did not improve from 0.48741 10/10 [==============================] - 9s 930ms/step - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 - val_loss: 0.4936 - val_n_outputs0_loss: 0.4351 - val_n_outputs1_loss: 0.0585 Epoch 11/100 10/10 [==============================] - ETA: 0s - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 Epoch 00011: val_loss improved from 0.48741 to 0.47748, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 11s 1s/step - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 - val_loss: 0.4775 - val_n_outputs0_loss: 0.4238 - val_n_outputs1_loss: 0.0536 Epoch 12/100 10/10 [==============================] - ETA: 0s - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 Epoch 00012: val_loss did not improve from 0.47748 10/10 [==============================] - 9s 925ms/step - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 - val_loss: 0.4836 - val_n_outputs0_loss: 0.4148 - val_n_outputs1_loss: 0.0687 Epoch 13/100 10/10 [==============================] - ETA: 0s - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 Epoch 00013: val_loss improved from 0.47748 to 0.40567, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 - val_loss: 0.4057 - val_n_outputs0_loss: 0.3540 - val_n_outputs1_loss: 0.0516 Epoch 14/100 10/10 [==============================] - ETA: 0s - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 Epoch 00014: val_loss improved from 0.40567 to 0.37099, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 - val_loss: 0.3710 - val_n_outputs0_loss: 0.3153 - val_n_outputs1_loss: 0.0556 Epoch 15/100 10/10 [==============================] - ETA: 0s - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 Epoch 00015: val_loss improved from 0.37099 to 0.33956, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 - val_loss: 0.3396 - val_n_outputs0_loss: 0.2853 - val_n_outputs1_loss: 0.0542 Epoch 16/100 10/10 [==============================] - ETA: 0s - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 Epoch 00016: val_loss improved from 0.33956 to 0.30289, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 - val_loss: 0.3029 - val_n_outputs0_loss: 0.2524 - val_n_outputs1_loss: 0.0505 Epoch 17/100 10/10 [==============================] - ETA: 0s - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 Epoch 00017: val_loss improved from 0.30289 to 0.28694, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 - val_loss: 0.2869 - val_n_outputs0_loss: 0.2390 - val_n_outputs1_loss: 0.0479 Epoch 18/100 10/10 [==============================] - ETA: 0s - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 Epoch 00018: val_loss improved from 0.28694 to 0.27270, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 - val_loss: 0.2727 - val_n_outputs0_loss: 0.2257 - val_n_outputs1_loss: 0.0470 Epoch 19/100 10/10 [==============================] - ETA: 0s - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 Epoch 00019: val_loss improved from 0.27270 to 0.25193, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 - val_loss: 0.2519 - val_n_outputs0_loss: 0.2099 - val_n_outputs1_loss: 0.0421 Epoch 20/100 10/10 [==============================] - ETA: 0s - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 Epoch 00020: val_loss improved from 0.25193 to 0.23899, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 - val_loss: 0.2390 - val_n_outputs0_loss: 0.1974 - val_n_outputs1_loss: 0.0416 Epoch 21/100 10/10 [==============================] - ETA: 0s - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 Epoch 00021: val_loss improved from 0.23899 to 0.23396, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 - val_loss: 0.2340 - val_n_outputs0_loss: 0.1911 - val_n_outputs1_loss: 0.0428 Epoch 22/100 10/10 [==============================] - ETA: 0s - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 Epoch 00022: val_loss improved from 0.23396 to 0.22651, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 - val_loss: 0.2265 - val_n_outputs0_loss: 0.1858 - val_n_outputs1_loss: 0.0407 Epoch 23/100 10/10 [==============================] - ETA: 0s - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 Epoch 00023: val_loss improved from 0.22651 to 0.22245, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 - val_loss: 0.2225 - val_n_outputs0_loss: 0.1806 - val_n_outputs1_loss: 0.0419 Epoch 24/100 10/10 [==============================] - ETA: 0s - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 Epoch 00024: val_loss improved from 0.22245 to 0.20674, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 - val_loss: 0.2067 - val_n_outputs0_loss: 0.1694 - val_n_outputs1_loss: 0.0374 Epoch 25/100 10/10 [==============================] - ETA: 0s - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 Epoch 00025: val_loss improved from 0.20674 to 0.20416, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 - val_loss: 0.2042 - val_n_outputs0_loss: 0.1638 - val_n_outputs1_loss: 0.0403 Epoch 26/100 10/10 [==============================] - ETA: 0s - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 Epoch 00026: val_loss improved from 0.20416 to 0.19422, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 - val_loss: 0.1942 - val_n_outputs0_loss: 0.1557 - val_n_outputs1_loss: 0.0385 Epoch 27/100 10/10 [==============================] - ETA: 0s - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 Epoch 00027: val_loss did not improve from 0.19422 10/10 [==============================] - 9s 930ms/step - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 - val_loss: 0.2016 - val_n_outputs0_loss: 0.1615 - val_n_outputs1_loss: 0.0401 Epoch 28/100 10/10 [==============================] - ETA: 0s - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 Epoch 00028: val_loss improved from 0.19422 to 0.18035, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 - val_loss: 0.1803 - val_n_outputs0_loss: 0.1445 - val_n_outputs1_loss: 0.0358 Epoch 29/100 10/10 [==============================] - ETA: 0s - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 Epoch 00029: val_loss improved from 0.18035 to 0.17528, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 - val_loss: 0.1753 - val_n_outputs0_loss: 0.1410 - val_n_outputs1_loss: 0.0343 Epoch 30/100 10/10 [==============================] - ETA: 0s - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 Epoch 00030: val_loss improved from 0.17528 to 0.17039, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 - val_loss: 0.1704 - val_n_outputs0_loss: 0.1372 - val_n_outputs1_loss: 0.0332 Epoch 31/100 10/10 [==============================] - ETA: 0s - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 Epoch 00031: val_loss did not improve from 0.17039 10/10 [==============================] - 9s 915ms/step - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 - val_loss: 0.1783 - val_n_outputs0_loss: 0.1436 - val_n_outputs1_loss: 0.0347 Epoch 32/100 10/10 [==============================] - ETA: 0s - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 Epoch 00032: val_loss improved from 0.17039 to 0.16278, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 - val_loss: 0.1628 - val_n_outputs0_loss: 0.1301 - val_n_outputs1_loss: 0.0327 Epoch 33/100 10/10 [==============================] - ETA: 0s - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 Epoch 00033: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 928ms/step - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 - val_loss: 0.1666 - val_n_outputs0_loss: 0.1345 - val_n_outputs1_loss: 0.0320 Epoch 34/100 10/10 [==============================] - ETA: 0s - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 Epoch 00034: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 - val_loss: 0.1728 - val_n_outputs0_loss: 0.1413 - val_n_outputs1_loss: 0.0315 Epoch 35/100 10/10 [==============================] - ETA: 0s - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 Epoch 00035: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 933ms/step - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 - val_loss: 0.1706 - val_n_outputs0_loss: 0.1391 - val_n_outputs1_loss: 0.0315 Epoch 36/100 10/10 [==============================] - ETA: 0s - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 Epoch 00036: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 936ms/step - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 - val_loss: 0.1729 - val_n_outputs0_loss: 0.1401 - val_n_outputs1_loss: 0.0328 Epoch 37/100 10/10 [==============================] - ETA: 0s - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 Epoch 00037: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 - val_loss: 0.1709 - val_n_outputs0_loss: 0.1381 - val_n_outputs1_loss: 0.0327 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff (donkey) arl@arl1: ```","title":"Training Log for MSP Car #1"},{"location":"training-logs/msp-1-cpu/#training-log-for-msp-car-1","text":"After cleanup we only got about 1,500 records. But here is a log of the training. It took about 1.5 minutes. 1 $ donkey train --tub = ./data/msp-car-1 --model = ./models/msp-car-1.f5 _ ______ _________ _ _ _ _ / _ _/ __ _ _ / / / _ _ // / _ _ / / / _ / _ `/ / _ / / // / / / / / / ,< / / / / / / / / / / / / / _ / _ // / / // /| | ___/ _ , / ____/ _ , / / / /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021-07-26 19:50:45.562205: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021-07-26 19:50:45.565106: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3592950000 Hz 2021-07-26 19:50:45.565470: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55d85e9d19f0 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-07-26 19:50:45.565492: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-07-26 19:50:45.565578: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance. Model: \"model\"","title":"Training Log for MSP Car #1"},{"location":"training-logs/msp-1-cpu/#layer-type-output-shape-param-connected-to","text":"img_in (InputLayer) [(None, 224, 224, 3) 0 conv2d_1 (Conv2D) (None, 110, 110, 24) 1824 img_in[0][0] dropout (Dropout) (None, 110, 110, 24) 0 conv2d_1[0][0] conv2d_2 (Conv2D) (None, 53, 53, 32) 19232 dropout[0][0] dropout_1 (Dropout) (None, 53, 53, 32) 0 conv2d_2[0][0] conv2d_3 (Conv2D) (None, 25, 25, 64) 51264 dropout_1[0][0] dropout_2 (Dropout) (None, 25, 25, 64) 0 conv2d_3[0][0] conv2d_4 (Conv2D) (None, 23, 23, 64) 36928 dropout_2[0][0] dropout_3 (Dropout) (None, 23, 23, 64) 0 conv2d_4[0][0] conv2d_5 (Conv2D) (None, 21, 21, 64) 36928 dropout_3[0][0] dropout_4 (Dropout) (None, 21, 21, 64) 0 conv2d_5[0][0] flattened (Flatten) (None, 28224) 0 dropout_4[0][0] dense_1 (Dense) (None, 100) 2822500 flattened[0][0] dropout_5 (Dropout) (None, 100) 0 dense_1[0][0] dense_2 (Dense) (None, 50) 5050 dropout_5[0][0] dropout_6 (Dropout) (None, 50) 0 dense_2[0][0] n_outputs0 (Dense) (None, 1) 51 dropout_6[0][0]","title":"Layer (type) Output Shape Param # Connected to"},{"location":"training-logs/msp-1-cpu/#n_outputs1-dense-none-1-51-dropout_600","text":"Total params: 2,973,828 Trainable params: 2,973,828 Non-trainable params: 0 None Using catalog /home/arl/mycar/data/msp-car-1/catalog_17.catalog Records # Training 1265 Records # Validation 317 Epoch 1/100 10/10 [==============================] - ETA: 0s - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 Epoch 00001: val_loss improved from inf to 0.54341, saving model to ./models/msp-car-1.f5 2021-07-26 19:50:57.881390: W tensorflow/python/util/util.cc:329] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. WARNING:tensorflow:From /home/arl/miniconda3/envs/donkey/lib/python3.7/site-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable. init (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 10/10 [==============================] - 11s 1s/step - loss: 1.0885 - n_outputs0_loss: 0.5975 - n_outputs1_loss: 0.4909 - val_loss: 0.5434 - val_n_outputs0_loss: 0.4668 - val_n_outputs1_loss: 0.0767 Epoch 2/100 10/10 [==============================] - ETA: 0s - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 Epoch 00002: val_loss improved from 0.54341 to 0.53272, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5522 - n_outputs0_loss: 0.4640 - n_outputs1_loss: 0.0882 - val_loss: 0.5327 - val_n_outputs0_loss: 0.4605 - val_n_outputs1_loss: 0.0722 Epoch 3/100 10/10 [==============================] - ETA: 0s - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 Epoch 00003: val_loss improved from 0.53272 to 0.50775, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5392 - n_outputs0_loss: 0.4638 - n_outputs1_loss: 0.0754 - val_loss: 0.5077 - val_n_outputs0_loss: 0.4551 - val_n_outputs1_loss: 0.0527 Epoch 4/100 10/10 [==============================] - ETA: 0s - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 Epoch 00004: val_loss improved from 0.50775 to 0.49783, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 999ms/step - loss: 0.5318 - n_outputs0_loss: 0.4605 - n_outputs1_loss: 0.0713 - val_loss: 0.4978 - val_n_outputs0_loss: 0.4455 - val_n_outputs1_loss: 0.0523 Epoch 5/100 10/10 [==============================] - ETA: 0s - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 Epoch 00005: val_loss improved from 0.49783 to 0.49721, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5333 - n_outputs0_loss: 0.4608 - n_outputs1_loss: 0.0725 - val_loss: 0.4972 - val_n_outputs0_loss: 0.4451 - val_n_outputs1_loss: 0.0521 Epoch 6/100 10/10 [==============================] - ETA: 0s - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 Epoch 00006: val_loss did not improve from 0.49721 10/10 [==============================] - 9s 934ms/step - loss: 0.5277 - n_outputs0_loss: 0.4619 - n_outputs1_loss: 0.0658 - val_loss: 0.4981 - val_n_outputs0_loss: 0.4461 - val_n_outputs1_loss: 0.0520 Epoch 7/100 10/10 [==============================] - ETA: 0s - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 Epoch 00007: val_loss improved from 0.49721 to 0.49668, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5265 - n_outputs0_loss: 0.4577 - n_outputs1_loss: 0.0688 - val_loss: 0.4967 - val_n_outputs0_loss: 0.4442 - val_n_outputs1_loss: 0.0525 Epoch 8/100 10/10 [==============================] - ETA: 0s - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 Epoch 00008: val_loss improved from 0.49668 to 0.49536, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5138 - n_outputs0_loss: 0.4467 - n_outputs1_loss: 0.0671 - val_loss: 0.4954 - val_n_outputs0_loss: 0.4408 - val_n_outputs1_loss: 0.0546 Epoch 9/100 10/10 [==============================] - ETA: 0s - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 Epoch 00009: val_loss improved from 0.49536 to 0.48741, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.5109 - n_outputs0_loss: 0.4468 - n_outputs1_loss: 0.0642 - val_loss: 0.4874 - val_n_outputs0_loss: 0.4353 - val_n_outputs1_loss: 0.0521 Epoch 10/100 10/10 [==============================] - ETA: 0s - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 Epoch 00010: val_loss did not improve from 0.48741 10/10 [==============================] - 9s 930ms/step - loss: 0.5030 - n_outputs0_loss: 0.4405 - n_outputs1_loss: 0.0625 - val_loss: 0.4936 - val_n_outputs0_loss: 0.4351 - val_n_outputs1_loss: 0.0585 Epoch 11/100 10/10 [==============================] - ETA: 0s - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 Epoch 00011: val_loss improved from 0.48741 to 0.47748, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 11s 1s/step - loss: 0.4974 - n_outputs0_loss: 0.4310 - n_outputs1_loss: 0.0664 - val_loss: 0.4775 - val_n_outputs0_loss: 0.4238 - val_n_outputs1_loss: 0.0536 Epoch 12/100 10/10 [==============================] - ETA: 0s - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 Epoch 00012: val_loss did not improve from 0.47748 10/10 [==============================] - 9s 925ms/step - loss: 0.4887 - n_outputs0_loss: 0.4208 - n_outputs1_loss: 0.0679 - val_loss: 0.4836 - val_n_outputs0_loss: 0.4148 - val_n_outputs1_loss: 0.0687 Epoch 13/100 10/10 [==============================] - ETA: 0s - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 Epoch 00013: val_loss improved from 0.47748 to 0.40567, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4591 - n_outputs0_loss: 0.3927 - n_outputs1_loss: 0.0664 - val_loss: 0.4057 - val_n_outputs0_loss: 0.3540 - val_n_outputs1_loss: 0.0516 Epoch 14/100 10/10 [==============================] - ETA: 0s - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 Epoch 00014: val_loss improved from 0.40567 to 0.37099, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.4323 - n_outputs0_loss: 0.3665 - n_outputs1_loss: 0.0658 - val_loss: 0.3710 - val_n_outputs0_loss: 0.3153 - val_n_outputs1_loss: 0.0556 Epoch 15/100 10/10 [==============================] - ETA: 0s - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 Epoch 00015: val_loss improved from 0.37099 to 0.33956, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3754 - n_outputs0_loss: 0.3063 - n_outputs1_loss: 0.0691 - val_loss: 0.3396 - val_n_outputs0_loss: 0.2853 - val_n_outputs1_loss: 0.0542 Epoch 16/100 10/10 [==============================] - ETA: 0s - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 Epoch 00016: val_loss improved from 0.33956 to 0.30289, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3314 - n_outputs0_loss: 0.2723 - n_outputs1_loss: 0.0591 - val_loss: 0.3029 - val_n_outputs0_loss: 0.2524 - val_n_outputs1_loss: 0.0505 Epoch 17/100 10/10 [==============================] - ETA: 0s - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 Epoch 00017: val_loss improved from 0.30289 to 0.28694, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.3168 - n_outputs0_loss: 0.2591 - n_outputs1_loss: 0.0576 - val_loss: 0.2869 - val_n_outputs0_loss: 0.2390 - val_n_outputs1_loss: 0.0479 Epoch 18/100 10/10 [==============================] - ETA: 0s - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 Epoch 00018: val_loss improved from 0.28694 to 0.27270, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2990 - n_outputs0_loss: 0.2446 - n_outputs1_loss: 0.0544 - val_loss: 0.2727 - val_n_outputs0_loss: 0.2257 - val_n_outputs1_loss: 0.0470 Epoch 19/100 10/10 [==============================] - ETA: 0s - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 Epoch 00019: val_loss improved from 0.27270 to 0.25193, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2706 - n_outputs0_loss: 0.2185 - n_outputs1_loss: 0.0521 - val_loss: 0.2519 - val_n_outputs0_loss: 0.2099 - val_n_outputs1_loss: 0.0421 Epoch 20/100 10/10 [==============================] - ETA: 0s - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 Epoch 00020: val_loss improved from 0.25193 to 0.23899, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2602 - n_outputs0_loss: 0.2112 - n_outputs1_loss: 0.0490 - val_loss: 0.2390 - val_n_outputs0_loss: 0.1974 - val_n_outputs1_loss: 0.0416 Epoch 21/100 10/10 [==============================] - ETA: 0s - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 Epoch 00021: val_loss improved from 0.23899 to 0.23396, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2345 - n_outputs0_loss: 0.1866 - n_outputs1_loss: 0.0479 - val_loss: 0.2340 - val_n_outputs0_loss: 0.1911 - val_n_outputs1_loss: 0.0428 Epoch 22/100 10/10 [==============================] - ETA: 0s - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 Epoch 00022: val_loss improved from 0.23396 to 0.22651, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2229 - n_outputs0_loss: 0.1758 - n_outputs1_loss: 0.0471 - val_loss: 0.2265 - val_n_outputs0_loss: 0.1858 - val_n_outputs1_loss: 0.0407 Epoch 23/100 10/10 [==============================] - ETA: 0s - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 Epoch 00023: val_loss improved from 0.22651 to 0.22245, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2175 - n_outputs0_loss: 0.1730 - n_outputs1_loss: 0.0445 - val_loss: 0.2225 - val_n_outputs0_loss: 0.1806 - val_n_outputs1_loss: 0.0419 Epoch 24/100 10/10 [==============================] - ETA: 0s - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 Epoch 00024: val_loss improved from 0.22245 to 0.20674, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.2084 - n_outputs0_loss: 0.1624 - n_outputs1_loss: 0.0460 - val_loss: 0.2067 - val_n_outputs0_loss: 0.1694 - val_n_outputs1_loss: 0.0374 Epoch 25/100 10/10 [==============================] - ETA: 0s - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 Epoch 00025: val_loss improved from 0.20674 to 0.20416, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1889 - n_outputs0_loss: 0.1457 - n_outputs1_loss: 0.0432 - val_loss: 0.2042 - val_n_outputs0_loss: 0.1638 - val_n_outputs1_loss: 0.0403 Epoch 26/100 10/10 [==============================] - ETA: 0s - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 Epoch 00026: val_loss improved from 0.20416 to 0.19422, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1882 - n_outputs0_loss: 0.1467 - n_outputs1_loss: 0.0414 - val_loss: 0.1942 - val_n_outputs0_loss: 0.1557 - val_n_outputs1_loss: 0.0385 Epoch 27/100 10/10 [==============================] - ETA: 0s - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 Epoch 00027: val_loss did not improve from 0.19422 10/10 [==============================] - 9s 930ms/step - loss: 0.1706 - n_outputs0_loss: 0.1328 - n_outputs1_loss: 0.0378 - val_loss: 0.2016 - val_n_outputs0_loss: 0.1615 - val_n_outputs1_loss: 0.0401 Epoch 28/100 10/10 [==============================] - ETA: 0s - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 Epoch 00028: val_loss improved from 0.19422 to 0.18035, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1630 - n_outputs0_loss: 0.1248 - n_outputs1_loss: 0.0382 - val_loss: 0.1803 - val_n_outputs0_loss: 0.1445 - val_n_outputs1_loss: 0.0358 Epoch 29/100 10/10 [==============================] - ETA: 0s - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 Epoch 00029: val_loss improved from 0.18035 to 0.17528, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1601 - n_outputs0_loss: 0.1219 - n_outputs1_loss: 0.0382 - val_loss: 0.1753 - val_n_outputs0_loss: 0.1410 - val_n_outputs1_loss: 0.0343 Epoch 30/100 10/10 [==============================] - ETA: 0s - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 Epoch 00030: val_loss improved from 0.17528 to 0.17039, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1483 - n_outputs0_loss: 0.1117 - n_outputs1_loss: 0.0366 - val_loss: 0.1704 - val_n_outputs0_loss: 0.1372 - val_n_outputs1_loss: 0.0332 Epoch 31/100 10/10 [==============================] - ETA: 0s - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 Epoch 00031: val_loss did not improve from 0.17039 10/10 [==============================] - 9s 915ms/step - loss: 0.1481 - n_outputs0_loss: 0.1114 - n_outputs1_loss: 0.0368 - val_loss: 0.1783 - val_n_outputs0_loss: 0.1436 - val_n_outputs1_loss: 0.0347 Epoch 32/100 10/10 [==============================] - ETA: 0s - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 Epoch 00032: val_loss improved from 0.17039 to 0.16278, saving model to ./models/msp-car-1.f5 10/10 [==============================] - 10s 1s/step - loss: 0.1470 - n_outputs0_loss: 0.1111 - n_outputs1_loss: 0.0358 - val_loss: 0.1628 - val_n_outputs0_loss: 0.1301 - val_n_outputs1_loss: 0.0327 Epoch 33/100 10/10 [==============================] - ETA: 0s - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 Epoch 00033: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 928ms/step - loss: 0.1368 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0341 - val_loss: 0.1666 - val_n_outputs0_loss: 0.1345 - val_n_outputs1_loss: 0.0320 Epoch 34/100 10/10 [==============================] - ETA: 0s - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 Epoch 00034: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1305 - n_outputs0_loss: 0.0971 - n_outputs1_loss: 0.0334 - val_loss: 0.1728 - val_n_outputs0_loss: 0.1413 - val_n_outputs1_loss: 0.0315 Epoch 35/100 10/10 [==============================] - ETA: 0s - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 Epoch 00035: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 933ms/step - loss: 0.1353 - n_outputs0_loss: 0.1027 - n_outputs1_loss: 0.0326 - val_loss: 0.1706 - val_n_outputs0_loss: 0.1391 - val_n_outputs1_loss: 0.0315 Epoch 36/100 10/10 [==============================] - ETA: 0s - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 Epoch 00036: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 936ms/step - loss: 0.1319 - n_outputs0_loss: 0.0989 - n_outputs1_loss: 0.0331 - val_loss: 0.1729 - val_n_outputs0_loss: 0.1401 - val_n_outputs1_loss: 0.0328 Epoch 37/100 10/10 [==============================] - ETA: 0s - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 Epoch 00037: val_loss did not improve from 0.16278 10/10 [==============================] - 9s 929ms/step - loss: 0.1290 - n_outputs0_loss: 0.0952 - n_outputs1_loss: 0.0338 - val_loss: 0.1709 - val_n_outputs0_loss: 0.1381 - val_n_outputs1_loss: 0.0327 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff (donkey) arl@arl1: ```","title":"n_outputs1 (Dense) (None, 1) 51 dropout_6[0][0]"},{"location":"training-logs/msp-car-1/","text":"Minnesota STEM Partners Car 1 Training Log 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 time donkey train -- tub =./ data / msp - car - 1 -- model =./ models / msp - car - 1. h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 18 : 57.390998 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 18 : 57.409838 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.410285 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.410424 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.411314 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.412358 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.412506 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.413323 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.413712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.415437 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.415619 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416133 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416523 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.416750 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 18 : 57.420820 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 18 : 57.421125 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cbee7970 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.421136 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 18 : 57.421270 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.421679 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.421712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.421724 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.421735 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.421746 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.421756 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.421766 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.421776 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.421840 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422285 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422675 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.422700 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.504507 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 18 : 57.504534 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 18 : 57.504541 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 18 : 57.504754 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505207 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505632 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.506019 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9892 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 18 : 57.507379 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cdd66f30 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.507389 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / msp - car - 1 / catalog_17 . catalog Records # Training 1265 Records # Validation 317 Epoch 1 / 100 2021 - 07 - 26 21 : 18 : 58.397797 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 58.705078 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 59.429125 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 18 : 59.481809 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 Epoch 00001 : val_loss improved from inf to 0.60297 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 3 s 288 ms / step - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 - val_loss : 0.6030 - val_n_outputs0_loss : 0.4514 - val_n_outputs1_loss : 0.1516 Epoch 2 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 Epoch 00002 : val_loss improved from 0.60297 to 0.51595 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 124 ms / step - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 - val_loss : 0.5160 - val_n_outputs0_loss : 0.4188 - val_n_outputs1_loss : 0.0972 Epoch 3 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 Epoch 00003 : val_loss improved from 0.51595 to 0.50280 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 - val_loss : 0.5028 - val_n_outputs0_loss : 0.4224 - val_n_outputs1_loss : 0.0804 Epoch 4 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 Epoch 00004 : val_loss improved from 0.50280 to 0.49159 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 - val_loss : 0.4916 - val_n_outputs0_loss : 0.4203 - val_n_outputs1_loss : 0.0713 Epoch 5 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 Epoch 00005 : val_loss improved from 0.49159 to 0.48784 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 - val_loss : 0.4878 - val_n_outputs0_loss : 0.4107 - val_n_outputs1_loss : 0.0772 Epoch 6 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 Epoch 00006 : val_loss improved from 0.48784 to 0.48521 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 - val_loss : 0.4852 - val_n_outputs0_loss : 0.4127 - val_n_outputs1_loss : 0.0725 Epoch 7 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 Epoch 00007 : val_loss improved from 0.48521 to 0.48270 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 - val_loss : 0.4827 - val_n_outputs0_loss : 0.4097 - val_n_outputs1_loss : 0.0730 Epoch 8 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 Epoch 00008 : val_loss improved from 0.48270 to 0.47415 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 - val_loss : 0.4741 - val_n_outputs0_loss : 0.4026 - val_n_outputs1_loss : 0.0715 Epoch 9 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 Epoch 00009 : val_loss did not improve from 0.47415 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 - val_loss : 0.4780 - val_n_outputs0_loss : 0.4069 - val_n_outputs1_loss : 0.0711 Epoch 10 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 Epoch 00010 : val_loss improved from 0.47415 to 0.45939 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 - val_loss : 0.4594 - val_n_outputs0_loss : 0.3903 - val_n_outputs1_loss : 0.0691 Epoch 11 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 Epoch 00011 : val_loss improved from 0.45939 to 0.44304 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 - val_loss : 0.4430 - val_n_outputs0_loss : 0.3672 - val_n_outputs1_loss : 0.0758 Epoch 12 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 Epoch 00012 : val_loss improved from 0.44304 to 0.36563 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 - val_loss : 0.3656 - val_n_outputs0_loss : 0.2934 - val_n_outputs1_loss : 0.0723 Epoch 13 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 Epoch 00013 : val_loss improved from 0.36563 to 0.30773 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 - val_loss : 0.3077 - val_n_outputs0_loss : 0.2463 - val_n_outputs1_loss : 0.0614 Epoch 14 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 Epoch 00014 : val_loss improved from 0.30773 to 0.27574 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 - val_loss : 0.2757 - val_n_outputs0_loss : 0.2294 - val_n_outputs1_loss : 0.0463 Epoch 15 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 Epoch 00015 : val_loss improved from 0.27574 to 0.24205 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 - val_loss : 0.2421 - val_n_outputs0_loss : 0.1966 - val_n_outputs1_loss : 0.0454 Epoch 16 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 Epoch 00016 : val_loss did not improve from 0.24205 10 / 10 [ ============================== ] - 1 s 100 ms / step - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 - val_loss : 0.2473 - val_n_outputs0_loss : 0.2023 - val_n_outputs1_loss : 0.0450 Epoch 17 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 Epoch 00017 : val_loss improved from 0.24205 to 0.22809 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 - val_loss : 0.2281 - val_n_outputs0_loss : 0.1842 - val_n_outputs1_loss : 0.0438 Epoch 18 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 Epoch 00018 : val_loss improved from 0.22809 to 0.21671 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 - val_loss : 0.2167 - val_n_outputs0_loss : 0.1768 - val_n_outputs1_loss : 0.0400 Epoch 19 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 Epoch 00019 : val_loss did not improve from 0.21671 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 - val_loss : 0.2190 - val_n_outputs0_loss : 0.1788 - val_n_outputs1_loss : 0.0402 Epoch 20 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 Epoch 00020 : val_loss improved from 0.21671 to 0.21046 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 - val_loss : 0.2105 - val_n_outputs0_loss : 0.1718 - val_n_outputs1_loss : 0.0386 Epoch 21 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 Epoch 00021 : val_loss improved from 0.21046 to 0.20605 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 - val_loss : 0.2060 - val_n_outputs0_loss : 0.1675 - val_n_outputs1_loss : 0.0385 Epoch 22 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 Epoch 00022 : val_loss improved from 0.20605 to 0.20553 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 106 ms / step - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 - val_loss : 0.2055 - val_n_outputs0_loss : 0.1711 - val_n_outputs1_loss : 0.0344 Epoch 23 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 Epoch 00023 : val_loss improved from 0.20553 to 0.20273 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 - val_loss : 0.2027 - val_n_outputs0_loss : 0.1697 - val_n_outputs1_loss : 0.0331 Epoch 24 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 Epoch 00024 : val_loss improved from 0.20273 to 0.19049 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 - val_loss : 0.1905 - val_n_outputs0_loss : 0.1562 - val_n_outputs1_loss : 0.0343 Epoch 25 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 Epoch 00025 : val_loss improved from 0.19049 to 0.18404 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 - val_loss : 0.1840 - val_n_outputs0_loss : 0.1488 - val_n_outputs1_loss : 0.0352 Epoch 26 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 Epoch 00026 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 102 ms / step - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 - val_loss : 0.1907 - val_n_outputs0_loss : 0.1563 - val_n_outputs1_loss : 0.0344 Epoch 27 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 Epoch 00027 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 - val_loss : 0.1922 - val_n_outputs0_loss : 0.1527 - val_n_outputs1_loss : 0.0396 Epoch 28 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 Epoch 00028 : val_loss improved from 0.18404 to 0.17462 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 - val_loss : 0.1746 - val_n_outputs0_loss : 0.1436 - val_n_outputs1_loss : 0.0311 Epoch 29 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 Epoch 00029 : val_loss improved from 0.17462 to 0.17365 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 - val_loss : 0.1736 - val_n_outputs0_loss : 0.1432 - val_n_outputs1_loss : 0.0305 Epoch 30 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 Epoch 00030 : val_loss did not improve from 0.17365 10 / 10 [ ============================== ] - 1 s 96 ms / step - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 - val_loss : 0.1799 - val_n_outputs0_loss : 0.1493 - val_n_outputs1_loss : 0.0306 Epoch 31 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 Epoch 00031 : val_loss improved from 0.17365 to 0.17255 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 - val_loss : 0.1726 - val_n_outputs0_loss : 0.1383 - val_n_outputs1_loss : 0.0342 Epoch 32 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 Epoch 00032 : val_loss did not improve from 0.17255 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 - val_loss : 0.1764 - val_n_outputs0_loss : 0.1456 - val_n_outputs1_loss : 0.0308 Epoch 33 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 Epoch 00033 : val_loss improved from 0.17255 to 0.17092 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 115 ms / step - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 - val_loss : 0.1709 - val_n_outputs0_loss : 0.1395 - val_n_outputs1_loss : 0.0315 Epoch 34 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 Epoch 00034 : val_loss improved from 0.17092 to 0.16704 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 - val_loss : 0.1670 - val_n_outputs0_loss : 0.1342 - val_n_outputs1_loss : 0.0329 Epoch 35 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 Epoch 00035 : val_loss improved from 0.16704 to 0.15917 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 - val_loss : 0.1592 - val_n_outputs0_loss : 0.1280 - val_n_outputs1_loss : 0.0311 Epoch 36 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 Epoch 00036 : val_loss improved from 0.15917 to 0.15774 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 114 ms / step - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 - val_loss : 0.1577 - val_n_outputs0_loss : 0.1264 - val_n_outputs1_loss : 0.0313 Epoch 37 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 Epoch 00037 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 - val_loss : 0.1598 - val_n_outputs0_loss : 0.1281 - val_n_outputs1_loss : 0.0317 Epoch 38 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 Epoch 00038 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 - val_loss : 0.1586 - val_n_outputs0_loss : 0.1269 - val_n_outputs1_loss : 0.0317 Epoch 39 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 Epoch 00039 : val_loss improved from 0.15774 to 0.15441 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 - val_loss : 0.1544 - val_n_outputs0_loss : 0.1243 - val_n_outputs1_loss : 0.0301 Epoch 40 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 Epoch 00040 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 - val_loss : 0.1588 - val_n_outputs0_loss : 0.1275 - val_n_outputs1_loss : 0.0313 Epoch 41 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 Epoch 00041 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 - val_loss : 0.1580 - val_n_outputs0_loss : 0.1271 - val_n_outputs1_loss : 0.0308 Epoch 42 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 Epoch 00042 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 - val_loss : 0.1614 - val_n_outputs0_loss : 0.1315 - val_n_outputs1_loss : 0.0299 Epoch 43 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 Epoch 00043 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 - val_loss : 0.1587 - val_n_outputs0_loss : 0.1298 - val_n_outputs1_loss : 0.0288 Epoch 44 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 Epoch 00044 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 - val_loss : 0.1601 - val_n_outputs0_loss : 0.1304 - val_n_outputs1_loss : 0.0296 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m10 . 563 s user 1 m11 . 485 s sys 0 m39 . 110 s","title":"MSP Car 1"},{"location":"training-logs/msp-car-1/#minnesota-stem-partners-car-1-training-log","text":"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 time donkey train -- tub =./ data / msp - car - 1 -- model =./ models / msp - car - 1. h5 ________ ______ _________ ___ __ \\ _______________ / ___________ __ __ ____ / _____ ________ __ / / / __ \\ _ __ \\ _ // _ / _ \\ _ / / / _ / _ __ ` / _ ___ / _ / _ / // / _ / / / / / , < / __ / / _ / / / / ___ / / _ / / _ / / _____ / \\ ____ // _ / / _ // _ /| _ | \\ ___ / _ \\ __ , / \\ ____ / \\ __ , _ / / _ / / ____ / using donkey v4 . 2.1 ... loading config file : ./ config . py loading personal config over - rides from myconfig . py \"get_model_by_type\" model Type is : linear Created KerasLinear 2021 - 07 - 26 21 : 18 : 57.390998 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcuda . so . 1 2021 - 07 - 26 21 : 18 : 57.409838 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.410285 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.410424 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.411314 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.412358 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.412506 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.413323 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.413712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.415437 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.415619 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416133 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.416523 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.416750 : I tensorflow / core / platform / cpu_feature_guard . cc : 143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use : SSE4 . 1 SSE4 . 2 AVX AVX2 FMA 2021 - 07 - 26 21 : 18 : 57.420820 : I tensorflow / core / platform / profile_utils / cpu_utils . cc : 102 ] CPU Frequency : 3592950000 Hz 2021 - 07 - 26 21 : 18 : 57.421125 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cbee7970 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.421136 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): Host , Default Version 2021 - 07 - 26 21 : 18 : 57.421270 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.421679 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1561 ] Found device 0 with properties : pciBusID : 0000 : 09 : 00.0 name : NVIDIA GeForce RTX 2080 Ti computeCapability : 7.5 coreClock : 1.635 GHz coreCount : 68 deviceMemorySize : 10.76 GiB deviceMemoryBandwidth : 573.69 GiB / s 2021 - 07 - 26 21 : 18 : 57.421712 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.421724 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 57.421735 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcufft . so . 10 2021 - 07 - 26 21 : 18 : 57.421746 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcurand . so . 10 2021 - 07 - 26 21 : 18 : 57.421756 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusolver . so . 10 2021 - 07 - 26 21 : 18 : 57.421766 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcusparse . so . 10 2021 - 07 - 26 21 : 18 : 57.421776 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 57.421840 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422285 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.422675 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1703 ] Adding visible gpu devices : 0 2021 - 07 - 26 21 : 18 : 57.422700 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudart . so . 10.1 2021 - 07 - 26 21 : 18 : 57.504507 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1102 ] Device interconnect StreamExecutor with strength 1 edge matrix : 2021 - 07 - 26 21 : 18 : 57.504534 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1108 ] 0 2021 - 07 - 26 21 : 18 : 57.504541 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1121 ] 0 : N 2021 - 07 - 26 21 : 18 : 57.504754 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505207 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.505632 : I tensorflow / stream_executor / cuda / cuda_gpu_executor . cc : 981 ] successful NUMA node read from SysFS had negative value ( - 1 ), but there must be at least one NUMA node , so returning NUMA node zero 2021 - 07 - 26 21 : 18 : 57.506019 : I tensorflow / core / common_runtime / gpu / gpu_device . cc : 1247 ] Created TensorFlow device ( / job : localhost / replica : 0 / task : 0 / device : GPU : 0 with 9892 MB memory ) -> physical GPU ( device : 0 , name : NVIDIA GeForce RTX 2080 Ti , pci bus id : 0000 : 09 : 00.0 , compute capability : 7.5 ) 2021 - 07 - 26 21 : 18 : 57.507379 : I tensorflow / compiler / xla / service / service . cc : 168 ] XLA service 0x5629cdd66f30 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices : 2021 - 07 - 26 21 : 18 : 57.507389 : I tensorflow / compiler / xla / service / service . cc : 176 ] StreamExecutor device ( 0 ): NVIDIA GeForce RTX 2080 Ti , Compute Capability 7.5 Model : \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None , 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None , 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None , 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None , 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None , 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None , 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None , 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None , 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None , 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None , 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None , 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None , 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None , 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None , 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None , 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None , 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None , 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params : 2 , 973 , 828 Trainable params : 2 , 973 , 828 Non - trainable params : 0 __________________________________________________________________________________________________ None Using catalog / home / arl / mycar / data / msp - car - 1 / catalog_17 . catalog Records # Training 1265 Records # Validation 317 Epoch 1 / 100 2021 - 07 - 26 21 : 18 : 58.397797 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcublas . so . 10 2021 - 07 - 26 21 : 18 : 58.705078 : I tensorflow / stream_executor / platform / default / dso_loader . cc : 44 ] Successfully opened dynamic library libcudnn . so . 7 2021 - 07 - 26 21 : 18 : 59.429125 : W tensorflow / stream_executor / gpu / asm_compiler . cc : 116 ] *** WARNING *** You are using ptxas 9.1 . 108 , which is older than 9.2 . 88. ptxas 9. x before 9.2 . 88 is known to miscompile XLA code , leading to incorrect results or invalid - address errors . You do not need to update to CUDA 9.2 . 88 ; cherry - picking the ptxas binary is sufficient . 2021 - 07 - 26 21 : 18 : 59.481809 : W tensorflow / stream_executor / gpu / redzone_allocator . cc : 314 ] Internal : ptxas exited with non - zero error code 65280 , output : ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation . Modify $ PATH to customize ptxas location . This message will be only logged once . 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 Epoch 00001 : val_loss improved from inf to 0.60297 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 3 s 288 ms / step - loss : 0.6674 - n_outputs0_loss : 0.5162 - n_outputs1_loss : 0.1512 - val_loss : 0.6030 - val_n_outputs0_loss : 0.4514 - val_n_outputs1_loss : 0.1516 Epoch 2 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 Epoch 00002 : val_loss improved from 0.60297 to 0.51595 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 124 ms / step - loss : 0.6050 - n_outputs0_loss : 0.5074 - n_outputs1_loss : 0.0976 - val_loss : 0.5160 - val_n_outputs0_loss : 0.4188 - val_n_outputs1_loss : 0.0972 Epoch 3 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 Epoch 00003 : val_loss improved from 0.51595 to 0.50280 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5707 - n_outputs0_loss : 0.4923 - n_outputs1_loss : 0.0784 - val_loss : 0.5028 - val_n_outputs0_loss : 0.4224 - val_n_outputs1_loss : 0.0804 Epoch 4 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 Epoch 00004 : val_loss improved from 0.50280 to 0.49159 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5615 - n_outputs0_loss : 0.4917 - n_outputs1_loss : 0.0698 - val_loss : 0.4916 - val_n_outputs0_loss : 0.4203 - val_n_outputs1_loss : 0.0713 Epoch 5 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 Epoch 00005 : val_loss improved from 0.49159 to 0.48784 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.5541 - n_outputs0_loss : 0.4854 - n_outputs1_loss : 0.0687 - val_loss : 0.4878 - val_n_outputs0_loss : 0.4107 - val_n_outputs1_loss : 0.0772 Epoch 6 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 Epoch 00006 : val_loss improved from 0.48784 to 0.48521 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5527 - n_outputs0_loss : 0.4827 - n_outputs1_loss : 0.0701 - val_loss : 0.4852 - val_n_outputs0_loss : 0.4127 - val_n_outputs1_loss : 0.0725 Epoch 7 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 Epoch 00007 : val_loss improved from 0.48521 to 0.48270 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.5405 - n_outputs0_loss : 0.4764 - n_outputs1_loss : 0.0641 - val_loss : 0.4827 - val_n_outputs0_loss : 0.4097 - val_n_outputs1_loss : 0.0730 Epoch 8 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 Epoch 00008 : val_loss improved from 0.48270 to 0.47415 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.5383 - n_outputs0_loss : 0.4724 - n_outputs1_loss : 0.0659 - val_loss : 0.4741 - val_n_outputs0_loss : 0.4026 - val_n_outputs1_loss : 0.0715 Epoch 9 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 Epoch 00009 : val_loss did not improve from 0.47415 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.5288 - n_outputs0_loss : 0.4640 - n_outputs1_loss : 0.0648 - val_loss : 0.4780 - val_n_outputs0_loss : 0.4069 - val_n_outputs1_loss : 0.0711 Epoch 10 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 Epoch 00010 : val_loss improved from 0.47415 to 0.45939 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.5344 - n_outputs0_loss : 0.4677 - n_outputs1_loss : 0.0667 - val_loss : 0.4594 - val_n_outputs0_loss : 0.3903 - val_n_outputs1_loss : 0.0691 Epoch 11 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 Epoch 00011 : val_loss improved from 0.45939 to 0.44304 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.5014 - n_outputs0_loss : 0.4349 - n_outputs1_loss : 0.0666 - val_loss : 0.4430 - val_n_outputs0_loss : 0.3672 - val_n_outputs1_loss : 0.0758 Epoch 12 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 Epoch 00012 : val_loss improved from 0.44304 to 0.36563 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.4585 - n_outputs0_loss : 0.3847 - n_outputs1_loss : 0.0738 - val_loss : 0.3656 - val_n_outputs0_loss : 0.2934 - val_n_outputs1_loss : 0.0723 Epoch 13 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 Epoch 00013 : val_loss improved from 0.36563 to 0.30773 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.3922 - n_outputs0_loss : 0.3257 - n_outputs1_loss : 0.0664 - val_loss : 0.3077 - val_n_outputs0_loss : 0.2463 - val_n_outputs1_loss : 0.0614 Epoch 14 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 Epoch 00014 : val_loss improved from 0.30773 to 0.27574 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.3662 - n_outputs0_loss : 0.3052 - n_outputs1_loss : 0.0610 - val_loss : 0.2757 - val_n_outputs0_loss : 0.2294 - val_n_outputs1_loss : 0.0463 Epoch 15 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 Epoch 00015 : val_loss improved from 0.27574 to 0.24205 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.3233 - n_outputs0_loss : 0.2626 - n_outputs1_loss : 0.0607 - val_loss : 0.2421 - val_n_outputs0_loss : 0.1966 - val_n_outputs1_loss : 0.0454 Epoch 16 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 Epoch 00016 : val_loss did not improve from 0.24205 10 / 10 [ ============================== ] - 1 s 100 ms / step - loss : 0.3078 - n_outputs0_loss : 0.2500 - n_outputs1_loss : 0.0577 - val_loss : 0.2473 - val_n_outputs0_loss : 0.2023 - val_n_outputs1_loss : 0.0450 Epoch 17 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 Epoch 00017 : val_loss improved from 0.24205 to 0.22809 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2959 - n_outputs0_loss : 0.2404 - n_outputs1_loss : 0.0555 - val_loss : 0.2281 - val_n_outputs0_loss : 0.1842 - val_n_outputs1_loss : 0.0438 Epoch 18 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 Epoch 00018 : val_loss improved from 0.22809 to 0.21671 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.2820 - n_outputs0_loss : 0.2280 - n_outputs1_loss : 0.0540 - val_loss : 0.2167 - val_n_outputs0_loss : 0.1768 - val_n_outputs1_loss : 0.0400 Epoch 19 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 Epoch 00019 : val_loss did not improve from 0.21671 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.2568 - n_outputs0_loss : 0.2044 - n_outputs1_loss : 0.0524 - val_loss : 0.2190 - val_n_outputs0_loss : 0.1788 - val_n_outputs1_loss : 0.0402 Epoch 20 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 Epoch 00020 : val_loss improved from 0.21671 to 0.21046 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.2621 - n_outputs0_loss : 0.2123 - n_outputs1_loss : 0.0499 - val_loss : 0.2105 - val_n_outputs0_loss : 0.1718 - val_n_outputs1_loss : 0.0386 Epoch 21 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 Epoch 00021 : val_loss improved from 0.21046 to 0.20605 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.2521 - n_outputs0_loss : 0.2052 - n_outputs1_loss : 0.0469 - val_loss : 0.2060 - val_n_outputs0_loss : 0.1675 - val_n_outputs1_loss : 0.0385 Epoch 22 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 Epoch 00022 : val_loss improved from 0.20605 to 0.20553 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 106 ms / step - loss : 0.2261 - n_outputs0_loss : 0.1781 - n_outputs1_loss : 0.0480 - val_loss : 0.2055 - val_n_outputs0_loss : 0.1711 - val_n_outputs1_loss : 0.0344 Epoch 23 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 Epoch 00023 : val_loss improved from 0.20553 to 0.20273 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2222 - n_outputs0_loss : 0.1794 - n_outputs1_loss : 0.0429 - val_loss : 0.2027 - val_n_outputs0_loss : 0.1697 - val_n_outputs1_loss : 0.0331 Epoch 24 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 Epoch 00024 : val_loss improved from 0.20273 to 0.19049 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.2126 - n_outputs0_loss : 0.1698 - n_outputs1_loss : 0.0428 - val_loss : 0.1905 - val_n_outputs0_loss : 0.1562 - val_n_outputs1_loss : 0.0343 Epoch 25 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 Epoch 00025 : val_loss improved from 0.19049 to 0.18404 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.2062 - n_outputs0_loss : 0.1658 - n_outputs1_loss : 0.0404 - val_loss : 0.1840 - val_n_outputs0_loss : 0.1488 - val_n_outputs1_loss : 0.0352 Epoch 26 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 Epoch 00026 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 102 ms / step - loss : 0.1928 - n_outputs0_loss : 0.1555 - n_outputs1_loss : 0.0372 - val_loss : 0.1907 - val_n_outputs0_loss : 0.1563 - val_n_outputs1_loss : 0.0344 Epoch 27 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 Epoch 00027 : val_loss did not improve from 0.18404 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.1834 - n_outputs0_loss : 0.1428 - n_outputs1_loss : 0.0406 - val_loss : 0.1922 - val_n_outputs0_loss : 0.1527 - val_n_outputs1_loss : 0.0396 Epoch 28 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 Epoch 00028 : val_loss improved from 0.18404 to 0.17462 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 113 ms / step - loss : 0.1668 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0386 - val_loss : 0.1746 - val_n_outputs0_loss : 0.1436 - val_n_outputs1_loss : 0.0311 Epoch 29 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 Epoch 00029 : val_loss improved from 0.17462 to 0.17365 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1654 - n_outputs0_loss : 0.1282 - n_outputs1_loss : 0.0372 - val_loss : 0.1736 - val_n_outputs0_loss : 0.1432 - val_n_outputs1_loss : 0.0305 Epoch 30 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 Epoch 00030 : val_loss did not improve from 0.17365 10 / 10 [ ============================== ] - 1 s 96 ms / step - loss : 0.1615 - n_outputs0_loss : 0.1250 - n_outputs1_loss : 0.0364 - val_loss : 0.1799 - val_n_outputs0_loss : 0.1493 - val_n_outputs1_loss : 0.0306 Epoch 31 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 Epoch 00031 : val_loss improved from 0.17365 to 0.17255 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 112 ms / step - loss : 0.1495 - n_outputs0_loss : 0.1162 - n_outputs1_loss : 0.0332 - val_loss : 0.1726 - val_n_outputs0_loss : 0.1383 - val_n_outputs1_loss : 0.0342 Epoch 32 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 Epoch 00032 : val_loss did not improve from 0.17255 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.1453 - n_outputs0_loss : 0.1121 - n_outputs1_loss : 0.0333 - val_loss : 0.1764 - val_n_outputs0_loss : 0.1456 - val_n_outputs1_loss : 0.0308 Epoch 33 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 Epoch 00033 : val_loss improved from 0.17255 to 0.17092 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 115 ms / step - loss : 0.1346 - n_outputs0_loss : 0.1043 - n_outputs1_loss : 0.0303 - val_loss : 0.1709 - val_n_outputs0_loss : 0.1395 - val_n_outputs1_loss : 0.0315 Epoch 34 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 Epoch 00034 : val_loss improved from 0.17092 to 0.16704 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 109 ms / step - loss : 0.1293 - n_outputs0_loss : 0.0991 - n_outputs1_loss : 0.0302 - val_loss : 0.1670 - val_n_outputs0_loss : 0.1342 - val_n_outputs1_loss : 0.0329 Epoch 35 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 Epoch 00035 : val_loss improved from 0.16704 to 0.15917 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 110 ms / step - loss : 0.1196 - n_outputs0_loss : 0.0890 - n_outputs1_loss : 0.0306 - val_loss : 0.1592 - val_n_outputs0_loss : 0.1280 - val_n_outputs1_loss : 0.0311 Epoch 36 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 Epoch 00036 : val_loss improved from 0.15917 to 0.15774 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 114 ms / step - loss : 0.1086 - n_outputs0_loss : 0.0805 - n_outputs1_loss : 0.0281 - val_loss : 0.1577 - val_n_outputs0_loss : 0.1264 - val_n_outputs1_loss : 0.0313 Epoch 37 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 Epoch 00037 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 99 ms / step - loss : 0.1032 - n_outputs0_loss : 0.0753 - n_outputs1_loss : 0.0279 - val_loss : 0.1598 - val_n_outputs0_loss : 0.1281 - val_n_outputs1_loss : 0.0317 Epoch 38 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 Epoch 00038 : val_loss did not improve from 0.15774 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.1050 - n_outputs0_loss : 0.0783 - n_outputs1_loss : 0.0266 - val_loss : 0.1586 - val_n_outputs0_loss : 0.1269 - val_n_outputs1_loss : 0.0317 Epoch 39 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 Epoch 00039 : val_loss improved from 0.15774 to 0.15441 , saving model to ./ models / msp - car - 1. h5 10 / 10 [ ============================== ] - 1 s 111 ms / step - loss : 0.0983 - n_outputs0_loss : 0.0722 - n_outputs1_loss : 0.0261 - val_loss : 0.1544 - val_n_outputs0_loss : 0.1243 - val_n_outputs1_loss : 0.0301 Epoch 40 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 Epoch 00040 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 103 ms / step - loss : 0.0967 - n_outputs0_loss : 0.0703 - n_outputs1_loss : 0.0265 - val_loss : 0.1588 - val_n_outputs0_loss : 0.1275 - val_n_outputs1_loss : 0.0313 Epoch 41 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 Epoch 00041 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 104 ms / step - loss : 0.0989 - n_outputs0_loss : 0.0736 - n_outputs1_loss : 0.0253 - val_loss : 0.1580 - val_n_outputs0_loss : 0.1271 - val_n_outputs1_loss : 0.0308 Epoch 42 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 Epoch 00042 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 107 ms / step - loss : 0.1010 - n_outputs0_loss : 0.0758 - n_outputs1_loss : 0.0253 - val_loss : 0.1614 - val_n_outputs0_loss : 0.1315 - val_n_outputs1_loss : 0.0299 Epoch 43 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 Epoch 00043 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 101 ms / step - loss : 0.0923 - n_outputs0_loss : 0.0680 - n_outputs1_loss : 0.0243 - val_loss : 0.1587 - val_n_outputs0_loss : 0.1298 - val_n_outputs1_loss : 0.0288 Epoch 44 / 100 10 / 10 [ ============================== ] - ETA : 0 s - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 Epoch 00044 : val_loss did not improve from 0.15441 10 / 10 [ ============================== ] - 1 s 105 ms / step - loss : 0.0870 - n_outputs0_loss : 0.0629 - n_outputs1_loss : 0.0242 - val_loss : 0.1601 - val_n_outputs0_loss : 0.1304 - val_n_outputs1_loss : 0.0296 WARNING : CPU random generator seem to be failing , disable hardware random number generation WARNING : RDRND generated : 0xffffffff 0xffffffff 0xffffffff 0xffffffff real 1 m10 . 563 s user 1 m11 . 485 s sys 0 m39 . 110 s","title":"Minnesota STEM Partners Car 1 Training Log"},{"location":"training-logs/msp-car-2/","text":"Training run for Minneapolis STEM Partners Car #2 had 15045 images wc -l ~/mycar/data/msp-car-2/*.catalog 15045 ls -1 ~/mycar/data/msp-car-2/images | wc -l 15045 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 ( donkey ) arl@arl1:~/mycar$ donkey train --tub = ./data/msp-car-2 --model = ./models/msp-car-2.h5 ________ ______ _________ ___ __ \\_ ______________ /___________ __ __ ____/_____ ________ __ / / / __ \\_ __ \\_ //_/ _ \\_ / / / _ / _ __ ` /_ ___/ _ /_/ // /_/ / / / / ,< / __/ /_/ / / /___ / /_/ /_ / /_____/ \\_ ___//_/ /_//_/ | _ | \\_ __/_ \\_ _, / \\_ ___/ \\_ _,_/ /_/ /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021 -07-26 20 :22:54.320076: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcuda.so.1 2021 -07-26 20 :22:54.338339: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.338783: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.338925: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.339823: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.340834: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.340981: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.341775: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.342170: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.343898: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.344043: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344546: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.345163: I tensorflow/core/platform/cpu_feature_guard.cc:143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021 -07-26 20 :22:54.349277: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102 ] CPU Frequency: 3592950000 Hz 2021 -07-26 20 :22:54.349572: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e341a9f0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.349585: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : Host, Default Version 2021 -07-26 20 :22:54.349717: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350124: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.350160: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.350171: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.350180: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.350191: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.350200: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.350210: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.350220: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.350282: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350723: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.351106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.351127: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.423106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102 ] Device interconnect StreamExecutor with strength 1 edge matrix: 2021 -07-26 20 :22:54.423133: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108 ] 0 2021 -07-26 20 :22:54.423138: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121 ] 0 : N 2021 -07-26 20 :22:54.423354: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.423819: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424248: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247 ] Created TensorFlow device ( /job:localhost/replica:0/task:0/device:GPU:0 with 9890 MB memory ) -> physical GPU ( device: 0 , name: NVIDIA GeForce RTX 2080 Ti, pci bus id: 0000 :09:00.0, compute capability: 7 .5 ) 2021 -07-26 20 :22:54.425999: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e52b18b0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.426009: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : NVIDIA GeForce RTX 2080 Ti, Compute Capability 7 .5 Model: \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None, 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None, 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None, 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None, 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None, 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None, 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None, 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None, 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None, 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None, 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None, 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None, 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None, 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None, 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None, 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None, 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params: 2 ,973,828 Trainable params: 2 ,973,828 Non-trainable params: 0 __________________________________________________________________________________________________ None Using catalog /home/arl/mycar/data/msp-car-2/catalog_22.catalog Records # Training 11696 Records # Validation 2924 Epoch 1 /100 2021 -07-26 20 :22:55.471623: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:55.802565: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:56.515413: W tensorflow/stream_executor/gpu/asm_compiler.cc:116 ] *** WARNING *** You are using ptxas 9 .1.108, which is older than 9 .2.88. ptxas 9 .x before 9 .2.88 is known to miscompile XLA code, leading to incorrect results or invalid-address errors. You do not need to update to CUDA 9 .2.88 ; cherry-picking the ptxas binary is sufficient. 2021 -07-26 20 :22:56.559204: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314 ] Internal: ptxas exited with non-zero error code 65280 , output: ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation. Modify $PATH to customize ptxas location. This message will be only logged once. 92 /92 [==============================] - ETA: 0s - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 Epoch 00001 : val_loss improved from inf to 0 .59133, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 29s 310ms/step - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 - val_loss: 0 .5913 - val_n_outputs0_loss: 0 .3121 - val_n_outputs1_loss: 0 .2793 Epoch 2 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 Epoch 00002 : val_loss improved from 0 .59133 to 0 .39368, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 - val_loss: 0 .3937 - val_n_outputs0_loss: 0 .2108 - val_n_outputs1_loss: 0 .1828 Epoch 3 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 Epoch 00003 : val_loss improved from 0 .39368 to 0 .34087, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 - val_loss: 0 .3409 - val_n_outputs0_loss: 0 .1923 - val_n_outputs1_loss: 0 .1486 Epoch 4 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 Epoch 00004 : val_loss improved from 0 .34087 to 0 .30588, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 119ms/step - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 - val_loss: 0 .3059 - val_n_outputs0_loss: 0 .1771 - val_n_outputs1_loss: 0 .1288 Epoch 5 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 Epoch 00005 : val_loss improved from 0 .30588 to 0 .28650, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 113ms/step - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 - val_loss: 0 .2865 - val_n_outputs0_loss: 0 .1722 - val_n_outputs1_loss: 0 .1143 Epoch 6 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 Epoch 00006 : val_loss improved from 0 .28650 to 0 .26754, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 - val_loss: 0 .2675 - val_n_outputs0_loss: 0 .1623 - val_n_outputs1_loss: 0 .1053 Epoch 7 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 Epoch 00007 : val_loss improved from 0 .26754 to 0 .25034, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 - val_loss: 0 .2503 - val_n_outputs0_loss: 0 .1551 - val_n_outputs1_loss: 0 .0952 Epoch 8 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 Epoch 00008 : val_loss improved from 0 .25034 to 0 .24291, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 - val_loss: 0 .2429 - val_n_outputs0_loss: 0 .1524 - val_n_outputs1_loss: 0 .0905 Epoch 9 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 Epoch 00009 : val_loss improved from 0 .24291 to 0 .22718, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 - val_loss: 0 .2272 - val_n_outputs0_loss: 0 .1450 - val_n_outputs1_loss: 0 .0821 Epoch 10 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 Epoch 00010 : val_loss did not improve from 0 .22718 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 - val_loss: 0 .2305 - val_n_outputs0_loss: 0 .1471 - val_n_outputs1_loss: 0 .0834 Epoch 11 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 Epoch 00011 : val_loss improved from 0 .22718 to 0 .21581, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 - val_loss: 0 .2158 - val_n_outputs0_loss: 0 .1375 - val_n_outputs1_loss: 0 .0783 Epoch 12 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 Epoch 00012 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 - val_loss: 0 .2185 - val_n_outputs0_loss: 0 .1382 - val_n_outputs1_loss: 0 .0802 Epoch 13 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 Epoch 00013 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 - val_loss: 0 .2198 - val_n_outputs0_loss: 0 .1394 - val_n_outputs1_loss: 0 .0804 Epoch 14 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 Epoch 00014 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 - val_loss: 0 .2167 - val_n_outputs0_loss: 0 .1389 - val_n_outputs1_loss: 0 .0778 Epoch 15 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 Epoch 00015 : val_loss improved from 0 .21581 to 0 .20899, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 - val_loss: 0 .2090 - val_n_outputs0_loss: 0 .1345 - val_n_outputs1_loss: 0 .0745 Epoch 16 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 Epoch 00016 : val_loss did not improve from 0 .20899 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 - val_loss: 0 .2097 - val_n_outputs0_loss: 0 .1348 - val_n_outputs1_loss: 0 .0748 Epoch 17 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 Epoch 00017 : val_loss improved from 0 .20899 to 0 .20324, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 - val_loss: 0 .2032 - val_n_outputs0_loss: 0 .1329 - val_n_outputs1_loss: 0 .0703 Epoch 18 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 Epoch 00018 : val_loss improved from 0 .20324 to 0 .19965, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 - val_loss: 0 .1997 - val_n_outputs0_loss: 0 .1309 - val_n_outputs1_loss: 0 .0688 Epoch 19 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 Epoch 00019 : val_loss improved from 0 .19965 to 0 .19877, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 - val_loss: 0 .1988 - val_n_outputs0_loss: 0 .1294 - val_n_outputs1_loss: 0 .0694 Epoch 20 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 Epoch 00020 : val_loss did not improve from 0 .19877 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 - val_loss: 0 .2004 - val_n_outputs0_loss: 0 .1312 - val_n_outputs1_loss: 0 .0692 Epoch 21 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 Epoch 00021 : val_loss improved from 0 .19877 to 0 .19564, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 - val_loss: 0 .1956 - val_n_outputs0_loss: 0 .1252 - val_n_outputs1_loss: 0 .0704 Epoch 22 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 Epoch 00022 : val_loss improved from 0 .19564 to 0 .19422, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 - val_loss: 0 .1942 - val_n_outputs0_loss: 0 .1259 - val_n_outputs1_loss: 0 .0683 Epoch 23 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 Epoch 00023 : val_loss improved from 0 .19422 to 0 .19270, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 - val_loss: 0 .1927 - val_n_outputs0_loss: 0 .1245 - val_n_outputs1_loss: 0 .0682 Epoch 24 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 Epoch 00024 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 - val_loss: 0 .1969 - val_n_outputs0_loss: 0 .1283 - val_n_outputs1_loss: 0 .0686 Epoch 25 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 Epoch 00025 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 - val_loss: 0 .1990 - val_n_outputs0_loss: 0 .1284 - val_n_outputs1_loss: 0 .0706 Epoch 26 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 Epoch 00026 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 - val_loss: 0 .1929 - val_n_outputs0_loss: 0 .1250 - val_n_outputs1_loss: 0 .0678 Epoch 27 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 Epoch 00027 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 - val_loss: 0 .1937 - val_n_outputs0_loss: 0 .1269 - val_n_outputs1_loss: 0 .0668 Epoch 28 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 Epoch 00028 : val_loss improved from 0 .19270 to 0 .19161, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 - val_loss: 0 .1916 - val_n_outputs0_loss: 0 .1230 - val_n_outputs1_loss: 0 .0686 Epoch 29 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 Epoch 00029 : val_loss improved from 0 .19161 to 0 .18655, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 - val_loss: 0 .1865 - val_n_outputs0_loss: 0 .1216 - val_n_outputs1_loss: 0 .0650 Epoch 30 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 Epoch 00030 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 109ms/step - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 - val_loss: 0 .1936 - val_n_outputs0_loss: 0 .1240 - val_n_outputs1_loss: 0 .0696 Epoch 31 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 Epoch 00031 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 - val_loss: 0 .1889 - val_n_outputs0_loss: 0 .1222 - val_n_outputs1_loss: 0 .0667 Epoch 32 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 Epoch 00032 : val_loss improved from 0 .18655 to 0 .18343, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 - val_loss: 0 .1834 - val_n_outputs0_loss: 0 .1206 - val_n_outputs1_loss: 0 .0629 Epoch 33 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 Epoch 00033 : val_loss did not improve from 0 .18343 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 - val_loss: 0 .1843 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0652 Epoch 34 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 Epoch 00034 : val_loss improved from 0 .18343 to 0 .18117, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 - val_loss: 0 .1812 - val_n_outputs0_loss: 0 .1166 - val_n_outputs1_loss: 0 .0646 Epoch 35 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 Epoch 00035 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 - val_loss: 0 .1835 - val_n_outputs0_loss: 0 .1177 - val_n_outputs1_loss: 0 .0657 Epoch 36 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 Epoch 00036 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 111ms/step - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 - val_loss: 0 .1838 - val_n_outputs0_loss: 0 .1198 - val_n_outputs1_loss: 0 .0641 Epoch 37 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 Epoch 00037 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 109ms/step - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 - val_loss: 0 .1830 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0639 Epoch 38 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 Epoch 00038 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 - val_loss: 0 .1845 - val_n_outputs0_loss: 0 .1185 - val_n_outputs1_loss: 0 .0660 Epoch 39 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 Epoch 00039 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 - val_loss: 0 .1818 - val_n_outputs0_loss: 0 .1186 - val_n_outputs1_loss: 0 .0632 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff ( donkey ) arl@arl1:~/mycar$ Checking the models 1 ls -l models/* returns 1 2 3 4 5 6 7 8 9 10 ls -l models/* -rw-r--r-- 1 arl arl 32317 Jul 26 20:30 models/database.json -rw-r--r-- 1 arl arl 35773936 Jul 26 20:17 models/msp-car-1-gpu.h5 -rw-r--r-- 1 arl arl 27506 Jul 26 20:17 models/msp-car-1-gpu.png -rw-r--r-- 1 arl arl 23659 Jul 26 19:57 models/msp-car-1.png -rw-r--r-- 1 arl arl 35773936 Jul 26 20:29 models/msp-car-2.h5 -rw-r--r-- 1 arl arl 25670 Jul 26 20:30 models/msp-car-2.png -rw-r--r-- 1 arl arl 22616 Feb 2 2020 models/mypilot.h5_loss_acc_0.040245.png -rw-r--r-- 1 arl arl 26687 Feb 2 2020 models/mypilot.h5_loss_acc_0.042222.png -rw-r--r-- 1 arl arl 11939744 Feb 2 2020 models/ref-model.h5","title":"MSP Car 2"},{"location":"training-logs/msp-car-2/#training-run-for-minneapolis-stem-partners","text":"Car #2 had 15045 images wc -l ~/mycar/data/msp-car-2/*.catalog 15045","title":"Training run for Minneapolis STEM Partners"},{"location":"training-logs/msp-car-2/#ls-1-mycardatamsp-car-2images-wc-l","text":"15045 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 ( donkey ) arl@arl1:~/mycar$ donkey train --tub = ./data/msp-car-2 --model = ./models/msp-car-2.h5 ________ ______ _________ ___ __ \\_ ______________ /___________ __ __ ____/_____ ________ __ / / / __ \\_ __ \\_ //_/ _ \\_ / / / _ / _ __ ` /_ ___/ _ /_/ // /_/ / / / / ,< / __/ /_/ / / /___ / /_/ /_ / /_____/ \\_ ___//_/ /_//_/ | _ | \\_ __/_ \\_ _, / \\_ ___/ \\_ _,_/ /_/ /____/ using donkey v4.2.1 ... loading config file: ./config.py loading personal config over-rides from myconfig.py \"get_model_by_type\" model Type is: linear Created KerasLinear 2021 -07-26 20 :22:54.320076: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcuda.so.1 2021 -07-26 20 :22:54.338339: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.338783: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.338925: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.339823: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.340834: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.340981: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.341775: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.342170: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.343898: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.344043: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344546: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.344933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.345163: I tensorflow/core/platform/cpu_feature_guard.cc:143 ] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA 2021 -07-26 20 :22:54.349277: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102 ] CPU Frequency: 3592950000 Hz 2021 -07-26 20 :22:54.349572: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e341a9f0 initialized for platform Host ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.349585: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : Host, Default Version 2021 -07-26 20 :22:54.349717: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350124: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561 ] Found device 0 with properties: pciBusID: 0000 :09:00.0 name: NVIDIA GeForce RTX 2080 Ti computeCapability: 7 .5 coreClock: 1 .635GHz coreCount: 68 deviceMemorySize: 10 .76GiB deviceMemoryBandwidth: 573 .69GiB/s 2021 -07-26 20 :22:54.350160: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.350171: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:54.350180: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcufft.so.10 2021 -07-26 20 :22:54.350191: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcurand.so.10 2021 -07-26 20 :22:54.350200: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusolver.so.10 2021 -07-26 20 :22:54.350210: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcusparse.so.10 2021 -07-26 20 :22:54.350220: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:54.350282: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.350723: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.351106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703 ] Adding visible gpu devices: 0 2021 -07-26 20 :22:54.351127: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudart.so.10.1 2021 -07-26 20 :22:54.423106: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102 ] Device interconnect StreamExecutor with strength 1 edge matrix: 2021 -07-26 20 :22:54.423133: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108 ] 0 2021 -07-26 20 :22:54.423138: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121 ] 0 : N 2021 -07-26 20 :22:54.423354: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.423819: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424248: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:981 ] successful NUMA node read from SysFS had negative value ( -1 ) , but there must be at least one NUMA node, so returning NUMA node zero 2021 -07-26 20 :22:54.424632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247 ] Created TensorFlow device ( /job:localhost/replica:0/task:0/device:GPU:0 with 9890 MB memory ) -> physical GPU ( device: 0 , name: NVIDIA GeForce RTX 2080 Ti, pci bus id: 0000 :09:00.0, compute capability: 7 .5 ) 2021 -07-26 20 :22:54.425999: I tensorflow/compiler/xla/service/service.cc:168 ] XLA service 0x5575e52b18b0 initialized for platform CUDA ( this does not guarantee that XLA will be used ) . Devices: 2021 -07-26 20 :22:54.426009: I tensorflow/compiler/xla/service/service.cc:176 ] StreamExecutor device ( 0 ) : NVIDIA GeForce RTX 2080 Ti, Compute Capability 7 .5 Model: \"model\" __________________________________________________________________________________________________ Layer ( type ) Output Shape Param # Connected to ================================================================================================== img_in ( InputLayer ) [( None, 224 , 224 , 3 ) 0 __________________________________________________________________________________________________ conv2d_1 ( Conv2D ) ( None, 110 , 110 , 24 ) 1824 img_in [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout ( Dropout ) ( None, 110 , 110 , 24 ) 0 conv2d_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_2 ( Conv2D ) ( None, 53 , 53 , 32 ) 19232 dropout [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_1 ( Dropout ) ( None, 53 , 53 , 32 ) 0 conv2d_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_3 ( Conv2D ) ( None, 25 , 25 , 64 ) 51264 dropout_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_2 ( Dropout ) ( None, 25 , 25 , 64 ) 0 conv2d_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_4 ( Conv2D ) ( None, 23 , 23 , 64 ) 36928 dropout_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_3 ( Dropout ) ( None, 23 , 23 , 64 ) 0 conv2d_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ conv2d_5 ( Conv2D ) ( None, 21 , 21 , 64 ) 36928 dropout_3 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_4 ( Dropout ) ( None, 21 , 21 , 64 ) 0 conv2d_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ flattened ( Flatten ) ( None, 28224 ) 0 dropout_4 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_1 ( Dense ) ( None, 100 ) 2822500 flattened [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_5 ( Dropout ) ( None, 100 ) 0 dense_1 [ 0 ][ 0 ] __________________________________________________________________________________________________ dense_2 ( Dense ) ( None, 50 ) 5050 dropout_5 [ 0 ][ 0 ] __________________________________________________________________________________________________ dropout_6 ( Dropout ) ( None, 50 ) 0 dense_2 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs0 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] __________________________________________________________________________________________________ n_outputs1 ( Dense ) ( None, 1 ) 51 dropout_6 [ 0 ][ 0 ] ================================================================================================== Total params: 2 ,973,828 Trainable params: 2 ,973,828 Non-trainable params: 0 __________________________________________________________________________________________________ None Using catalog /home/arl/mycar/data/msp-car-2/catalog_22.catalog Records # Training 11696 Records # Validation 2924 Epoch 1 /100 2021 -07-26 20 :22:55.471623: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcublas.so.10 2021 -07-26 20 :22:55.802565: I tensorflow/stream_executor/platform/default/dso_loader.cc:44 ] Successfully opened dynamic library libcudnn.so.7 2021 -07-26 20 :22:56.515413: W tensorflow/stream_executor/gpu/asm_compiler.cc:116 ] *** WARNING *** You are using ptxas 9 .1.108, which is older than 9 .2.88. ptxas 9 .x before 9 .2.88 is known to miscompile XLA code, leading to incorrect results or invalid-address errors. You do not need to update to CUDA 9 .2.88 ; cherry-picking the ptxas binary is sufficient. 2021 -07-26 20 :22:56.559204: W tensorflow/stream_executor/gpu/redzone_allocator.cc:314 ] Internal: ptxas exited with non-zero error code 65280 , output: ptxas fatal : Value 'sm_75' is not defined for option 'gpu-name' Relying on driver to perform ptx compilation. Modify $PATH to customize ptxas location. This message will be only logged once. 92 /92 [==============================] - ETA: 0s - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 Epoch 00001 : val_loss improved from inf to 0 .59133, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 29s 310ms/step - loss: 0 .6304 - n_outputs0_loss: 0 .3238 - n_outputs1_loss: 0 .3066 - val_loss: 0 .5913 - val_n_outputs0_loss: 0 .3121 - val_n_outputs1_loss: 0 .2793 Epoch 2 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 Epoch 00002 : val_loss improved from 0 .59133 to 0 .39368, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .5150 - n_outputs0_loss: 0 .2730 - n_outputs1_loss: 0 .2419 - val_loss: 0 .3937 - val_n_outputs0_loss: 0 .2108 - val_n_outputs1_loss: 0 .1828 Epoch 3 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 Epoch 00003 : val_loss improved from 0 .39368 to 0 .34087, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 117ms/step - loss: 0 .3885 - n_outputs0_loss: 0 .2088 - n_outputs1_loss: 0 .1797 - val_loss: 0 .3409 - val_n_outputs0_loss: 0 .1923 - val_n_outputs1_loss: 0 .1486 Epoch 4 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 Epoch 00004 : val_loss improved from 0 .34087 to 0 .30588, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 11s 119ms/step - loss: 0 .3449 - n_outputs0_loss: 0 .1870 - n_outputs1_loss: 0 .1579 - val_loss: 0 .3059 - val_n_outputs0_loss: 0 .1771 - val_n_outputs1_loss: 0 .1288 Epoch 5 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 Epoch 00005 : val_loss improved from 0 .30588 to 0 .28650, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 113ms/step - loss: 0 .3161 - n_outputs0_loss: 0 .1763 - n_outputs1_loss: 0 .1397 - val_loss: 0 .2865 - val_n_outputs0_loss: 0 .1722 - val_n_outputs1_loss: 0 .1143 Epoch 6 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 Epoch 00006 : val_loss improved from 0 .28650 to 0 .26754, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2876 - n_outputs0_loss: 0 .1633 - n_outputs1_loss: 0 .1243 - val_loss: 0 .2675 - val_n_outputs0_loss: 0 .1623 - val_n_outputs1_loss: 0 .1053 Epoch 7 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 Epoch 00007 : val_loss improved from 0 .26754 to 0 .25034, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .2612 - n_outputs0_loss: 0 .1508 - n_outputs1_loss: 0 .1103 - val_loss: 0 .2503 - val_n_outputs0_loss: 0 .1551 - val_n_outputs1_loss: 0 .0952 Epoch 8 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 Epoch 00008 : val_loss improved from 0 .25034 to 0 .24291, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2476 - n_outputs0_loss: 0 .1435 - n_outputs1_loss: 0 .1041 - val_loss: 0 .2429 - val_n_outputs0_loss: 0 .1524 - val_n_outputs1_loss: 0 .0905 Epoch 9 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 Epoch 00009 : val_loss improved from 0 .24291 to 0 .22718, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2283 - n_outputs0_loss: 0 .1323 - n_outputs1_loss: 0 .0960 - val_loss: 0 .2272 - val_n_outputs0_loss: 0 .1450 - val_n_outputs1_loss: 0 .0821 Epoch 10 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 Epoch 00010 : val_loss did not improve from 0 .22718 92 /92 [==============================] - 10s 109ms/step - loss: 0 .2183 - n_outputs0_loss: 0 .1267 - n_outputs1_loss: 0 .0916 - val_loss: 0 .2305 - val_n_outputs0_loss: 0 .1471 - val_n_outputs1_loss: 0 .0834 Epoch 11 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 Epoch 00011 : val_loss improved from 0 .22718 to 0 .21581, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .2022 - n_outputs0_loss: 0 .1187 - n_outputs1_loss: 0 .0835 - val_loss: 0 .2158 - val_n_outputs0_loss: 0 .1375 - val_n_outputs1_loss: 0 .0783 Epoch 12 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 Epoch 00012 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1921 - n_outputs0_loss: 0 .1085 - n_outputs1_loss: 0 .0836 - val_loss: 0 .2185 - val_n_outputs0_loss: 0 .1382 - val_n_outputs1_loss: 0 .0802 Epoch 13 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 Epoch 00013 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1826 - n_outputs0_loss: 0 .1056 - n_outputs1_loss: 0 .0770 - val_loss: 0 .2198 - val_n_outputs0_loss: 0 .1394 - val_n_outputs1_loss: 0 .0804 Epoch 14 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 Epoch 00014 : val_loss did not improve from 0 .21581 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1771 - n_outputs0_loss: 0 .1009 - n_outputs1_loss: 0 .0762 - val_loss: 0 .2167 - val_n_outputs0_loss: 0 .1389 - val_n_outputs1_loss: 0 .0778 Epoch 15 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 Epoch 00015 : val_loss improved from 0 .21581 to 0 .20899, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1676 - n_outputs0_loss: 0 .0959 - n_outputs1_loss: 0 .0718 - val_loss: 0 .2090 - val_n_outputs0_loss: 0 .1345 - val_n_outputs1_loss: 0 .0745 Epoch 16 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 Epoch 00016 : val_loss did not improve from 0 .20899 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1608 - n_outputs0_loss: 0 .0910 - n_outputs1_loss: 0 .0698 - val_loss: 0 .2097 - val_n_outputs0_loss: 0 .1348 - val_n_outputs1_loss: 0 .0748 Epoch 17 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 Epoch 00017 : val_loss improved from 0 .20899 to 0 .20324, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1534 - n_outputs0_loss: 0 .0870 - n_outputs1_loss: 0 .0664 - val_loss: 0 .2032 - val_n_outputs0_loss: 0 .1329 - val_n_outputs1_loss: 0 .0703 Epoch 18 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 Epoch 00018 : val_loss improved from 0 .20324 to 0 .19965, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1490 - n_outputs0_loss: 0 .0846 - n_outputs1_loss: 0 .0644 - val_loss: 0 .1997 - val_n_outputs0_loss: 0 .1309 - val_n_outputs1_loss: 0 .0688 Epoch 19 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 Epoch 00019 : val_loss improved from 0 .19965 to 0 .19877, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1452 - n_outputs0_loss: 0 .0828 - n_outputs1_loss: 0 .0624 - val_loss: 0 .1988 - val_n_outputs0_loss: 0 .1294 - val_n_outputs1_loss: 0 .0694 Epoch 20 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 Epoch 00020 : val_loss did not improve from 0 .19877 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1353 - n_outputs0_loss: 0 .0747 - n_outputs1_loss: 0 .0606 - val_loss: 0 .2004 - val_n_outputs0_loss: 0 .1312 - val_n_outputs1_loss: 0 .0692 Epoch 21 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 Epoch 00021 : val_loss improved from 0 .19877 to 0 .19564, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1319 - n_outputs0_loss: 0 .0731 - n_outputs1_loss: 0 .0588 - val_loss: 0 .1956 - val_n_outputs0_loss: 0 .1252 - val_n_outputs1_loss: 0 .0704 Epoch 22 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 Epoch 00022 : val_loss improved from 0 .19564 to 0 .19422, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1299 - n_outputs0_loss: 0 .0713 - n_outputs1_loss: 0 .0585 - val_loss: 0 .1942 - val_n_outputs0_loss: 0 .1259 - val_n_outputs1_loss: 0 .0683 Epoch 23 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 Epoch 00023 : val_loss improved from 0 .19422 to 0 .19270, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1231 - n_outputs0_loss: 0 .0684 - n_outputs1_loss: 0 .0548 - val_loss: 0 .1927 - val_n_outputs0_loss: 0 .1245 - val_n_outputs1_loss: 0 .0682 Epoch 24 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 Epoch 00024 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1239 - n_outputs0_loss: 0 .0673 - n_outputs1_loss: 0 .0566 - val_loss: 0 .1969 - val_n_outputs0_loss: 0 .1283 - val_n_outputs1_loss: 0 .0686 Epoch 25 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 Epoch 00025 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1200 - n_outputs0_loss: 0 .0650 - n_outputs1_loss: 0 .0550 - val_loss: 0 .1990 - val_n_outputs0_loss: 0 .1284 - val_n_outputs1_loss: 0 .0706 Epoch 26 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 Epoch 00026 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1171 - n_outputs0_loss: 0 .0636 - n_outputs1_loss: 0 .0535 - val_loss: 0 .1929 - val_n_outputs0_loss: 0 .1250 - val_n_outputs1_loss: 0 .0678 Epoch 27 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 Epoch 00027 : val_loss did not improve from 0 .19270 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1167 - n_outputs0_loss: 0 .0638 - n_outputs1_loss: 0 .0529 - val_loss: 0 .1937 - val_n_outputs0_loss: 0 .1269 - val_n_outputs1_loss: 0 .0668 Epoch 28 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 Epoch 00028 : val_loss improved from 0 .19270 to 0 .19161, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 112ms/step - loss: 0 .1123 - n_outputs0_loss: 0 .0610 - n_outputs1_loss: 0 .0513 - val_loss: 0 .1916 - val_n_outputs0_loss: 0 .1230 - val_n_outputs1_loss: 0 .0686 Epoch 29 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 Epoch 00029 : val_loss improved from 0 .19161 to 0 .18655, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1086 - n_outputs0_loss: 0 .0584 - n_outputs1_loss: 0 .0501 - val_loss: 0 .1865 - val_n_outputs0_loss: 0 .1216 - val_n_outputs1_loss: 0 .0650 Epoch 30 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 Epoch 00030 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 109ms/step - loss: 0 .1093 - n_outputs0_loss: 0 .0593 - n_outputs1_loss: 0 .0500 - val_loss: 0 .1936 - val_n_outputs0_loss: 0 .1240 - val_n_outputs1_loss: 0 .0696 Epoch 31 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 Epoch 00031 : val_loss did not improve from 0 .18655 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1077 - n_outputs0_loss: 0 .0578 - n_outputs1_loss: 0 .0499 - val_loss: 0 .1889 - val_n_outputs0_loss: 0 .1222 - val_n_outputs1_loss: 0 .0667 Epoch 32 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 Epoch 00032 : val_loss improved from 0 .18655 to 0 .18343, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 111ms/step - loss: 0 .1026 - n_outputs0_loss: 0 .0551 - n_outputs1_loss: 0 .0475 - val_loss: 0 .1834 - val_n_outputs0_loss: 0 .1206 - val_n_outputs1_loss: 0 .0629 Epoch 33 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 Epoch 00033 : val_loss did not improve from 0 .18343 92 /92 [==============================] - 10s 110ms/step - loss: 0 .1022 - n_outputs0_loss: 0 .0545 - n_outputs1_loss: 0 .0477 - val_loss: 0 .1843 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0652 Epoch 34 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 Epoch 00034 : val_loss improved from 0 .18343 to 0 .18117, saving model to ./models/msp-car-2.h5 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0995 - n_outputs0_loss: 0 .0529 - n_outputs1_loss: 0 .0466 - val_loss: 0 .1812 - val_n_outputs0_loss: 0 .1166 - val_n_outputs1_loss: 0 .0646 Epoch 35 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 Epoch 00035 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0989 - n_outputs0_loss: 0 .0526 - n_outputs1_loss: 0 .0463 - val_loss: 0 .1835 - val_n_outputs0_loss: 0 .1177 - val_n_outputs1_loss: 0 .0657 Epoch 36 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 Epoch 00036 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 111ms/step - loss: 0 .0972 - n_outputs0_loss: 0 .0514 - n_outputs1_loss: 0 .0458 - val_loss: 0 .1838 - val_n_outputs0_loss: 0 .1198 - val_n_outputs1_loss: 0 .0641 Epoch 37 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 Epoch 00037 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 109ms/step - loss: 0 .0959 - n_outputs0_loss: 0 .0509 - n_outputs1_loss: 0 .0450 - val_loss: 0 .1830 - val_n_outputs0_loss: 0 .1191 - val_n_outputs1_loss: 0 .0639 Epoch 38 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 Epoch 00038 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0934 - n_outputs0_loss: 0 .0496 - n_outputs1_loss: 0 .0438 - val_loss: 0 .1845 - val_n_outputs0_loss: 0 .1185 - val_n_outputs1_loss: 0 .0660 Epoch 39 /100 92 /92 [==============================] - ETA: 0s - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 Epoch 00039 : val_loss did not improve from 0 .18117 92 /92 [==============================] - 10s 110ms/step - loss: 0 .0923 - n_outputs0_loss: 0 .0477 - n_outputs1_loss: 0 .0446 - val_loss: 0 .1818 - val_n_outputs0_loss: 0 .1186 - val_n_outputs1_loss: 0 .0632 WARNING: CPU random generator seem to be failing, disable hardware random number generation WARNING: RDRND generated: 0xffffffff 0xffffffff 0xffffffff 0xffffffff ( donkey ) arl@arl1:~/mycar$","title":"ls -1 ~/mycar/data/msp-car-2/images | wc -l"},{"location":"training-logs/msp-car-2/#checking-the-models","text":"1 ls -l models/* returns 1 2 3 4 5 6 7 8 9 10 ls -l models/* -rw-r--r-- 1 arl arl 32317 Jul 26 20:30 models/database.json -rw-r--r-- 1 arl arl 35773936 Jul 26 20:17 models/msp-car-1-gpu.h5 -rw-r--r-- 1 arl arl 27506 Jul 26 20:17 models/msp-car-1-gpu.png -rw-r--r-- 1 arl arl 23659 Jul 26 19:57 models/msp-car-1.png -rw-r--r-- 1 arl arl 35773936 Jul 26 20:29 models/msp-car-2.h5 -rw-r--r-- 1 arl arl 25670 Jul 26 20:30 models/msp-car-2.png -rw-r--r-- 1 arl arl 22616 Feb 2 2020 models/mypilot.h5_loss_acc_0.040245.png -rw-r--r-- 1 arl arl 26687 Feb 2 2020 models/mypilot.h5_loss_acc_0.042222.png -rw-r--r-- 1 arl arl 11939744 Feb 2 2020 models/ref-model.h5","title":"Checking the models"}]} \ No newline at end of file diff --git a/setup/gpu-options/index.html b/setup/gpu-options/index.html new file mode 100644 index 00000000..1fffc146 --- /dev/null +++ b/setup/gpu-options/index.html @@ -0,0 +1,1424 @@ + + + + + + + + + + + + + + + + GPU Options - AI Racing League + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + +
+
+ + + + + + + + +

GPU Options

+

PCPartPicker Part List: https://pcpartpicker.com/list/mrFYPX

+

CPU: AMD Ryzen 5 3600 3.6 GHz 6-Core Processor ($95.00 @ Amazon) +Motherboard: MSI A520M-A PRO Micro ATX AM4 Motherboard ($101.11 @ Amazon) +Memory: Silicon Power SP016GBLFU320X02 16 GB (1 x 16 GB) DDR4-3200 CL22 Memory ($23.99 @ Amazon) +Storage: TEAMGROUP MP33 512 GB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive ($22.49 @ Amazon) +Video Card: Asus Dual GeForce RTX 3060 V2 OC Edition GeForce RTX 3060 12GB 12 GB Video Card ($299.99 @ Amazon) +Case: Thermaltake Versa H18 MicroATX Mini Tower Case ($49.99 @ Amazon) +Power Supply: be quiet! Pure Power 11 400 W 80+ Gold Certified ATX Power Supply ($89.69 @ Amazon) +Monitor: *Acer V227Q Abmix 21.5" 1920 x 1080 75 Hz Monitor ($87.29 @ Amazon) +Total: $769.55

+ + +
+
+
+ +
+ + + + +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index e71d06d7..a7a4779a 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,257 +2,262 @@ None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 daily None - 2023-07-20 + 2023-07-23 + daily + + + None + 2023-07-23 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 5494b7d086dba59c1c0e8f1e2f8060d48917b3b6..34f27867e8a20eb836448d7ee5020285e28ae855 100644 GIT binary patch literal 227 zcmb2|=HR%xdT$ET|KiM&)ZD}Zy^7o%hPP+E`I-zwST9(vR+#H7$W|A0>dZprScXO} zl?zJiyWZXV)S1Yw_TBeaRrO`%P36~r>6->5mz*j~JW{iiJJ@WO*Uh(8e0(~S=T-3O zYQEmRY1x#k*S@KrJ6_1Ma^tGg)m&!-3bnGz75BB-aP|9C?VJ6wId!)CmSq#f7f*d~ zd0Xv?lV!`M6pE-jZsC7)B=lNNu=cB%@K<&#+I2oJ`^&M-kM!) zTlm{HEo=$BSFV2U_rCrW-*%m~>RO|1`Sfam;=Yy`7x!gm2Mr#xe>UsQ$yuj&E#u_z z+`khh=I1U<5`6Epkw4imWLi$>>D6bZ{CfArSv2x)jY_=g<`eZQ1rH81GPCo^SYR-I U)c+`%@a+|M;Dx>qA(9LX0HCjI#Q*>R diff --git a/slides/~$November-2019-Update.pptx b/slides/~$November-2019-Update.pptx new file mode 100644 index 0000000000000000000000000000000000000000..d73e9765151fc4f5a3a0e26cc3e9925b8f9cae47 GIT binary patch literal 165 ycmd;aNz7C5O?ECyO)RQpP#_lYFt{)zGUPERF!(YgGdMF8F{A?dMGQbAXaE7vsuK$U literal 0 HcmV?d00001 diff --git a/slides/~$Welcome-to-the-ARL.pptx b/slides/~$Welcome-to-the-ARL.pptx new file mode 100644 index 0000000000000000000000000000000000000000..d73e9765151fc4f5a3a0e26cc3e9925b8f9cae47 GIT binary patch literal 165 ycmd;aNz7C5O?ECyO)RQpP#_lYFt{)zGUPERF!(YgGdMF8F{A?dMGQbAXaE7vsuK$U literal 0 HcmV?d00001