[{"data":1,"prerenderedAt":220},["ShallowReactive",2],{"project-whosagoodboy":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"name":10,"featured":11,"topics":12,"year":15,"languages":16,"tools":23,"archived":6,"githubUrl":29,"heroImage":30,"homepage":33,"body":34,"_type":214,"_id":215,"_source":216,"_file":217,"_stem":218,"_extension":219},"/projects/whosagoodboy","projects",false,"","Whosagoodboy","Dog breed classification web app 🐶","whosagoodboy",true,[13,14],"machine learning","image classification",2022,[17,18,19,20,21,22],"Jupyter Notebook","PureBasic","TypeScript","SCSS","HCL","JavaScript",[24,25,26,27,28],"nextjs","react","tensorflow","tensorflowjs","terraform","https://github.com/ryanachten/whosagoodboy",{"remote":31,"local":32},"https://github.com/ryanachten/whosagoodboy/raw/main/docs/wagb_loading.gif","hero-images/whosagoodboy.webp","https://whosagoodboy.vercel.app/",{"type":35,"children":36,"toc":209},"root",[37,47,53,58,70,78,85,92,121,128,133,156,164,170,175],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42],{"type":38,"tag":43,"props":44,"children":46},"img",{"alt":45,"src":31},"Loading",[],{"type":38,"tag":48,"props":49,"children":50},"h1",{"id":10},[51],{"type":52,"value":10},"text",{"type":38,"tag":39,"props":54,"children":55},{},[56],{"type":52,"value":57},"Have you ever passed a cute dog on the street and thought \"I wonder what breed that dog is\"?",{"type":38,"tag":39,"props":59,"children":60},{},[61,63,68],{"type":52,"value":62},"Well, wonder no more. ",{"type":38,"tag":64,"props":65,"children":66},"strong",{},[67],{"type":52,"value":10},{"type":52,"value":69}," is a simple web app which allows you, through the power of machine learning, identify what breed that a mystery dog might be.",{"type":38,"tag":39,"props":71,"children":72},{},[73],{"type":38,"tag":43,"props":74,"children":77},{"alt":75,"src":76},"Upload","https://github.com/ryanachten/whosagoodboy/raw/main/docs/wagb_desktop_upload.png",[],{"type":38,"tag":79,"props":80,"children":82},"h2",{"id":81},"pipeline",[83],{"type":52,"value":84},"Pipeline",{"type":38,"tag":39,"props":86,"children":87},{},[88],{"type":38,"tag":43,"props":89,"children":91},{"alt":84,"src":90},"https://github.com/ryanachten/whosagoodboy/raw/main/docs/wagb_pipeline.png",[],{"type":38,"tag":93,"props":94,"children":95},"ol",{},[96,111,116],{"type":38,"tag":97,"props":98,"children":99},"li",{},[100,102],{"type":52,"value":101},"A Tensorflow model is trained on the ",{"type":38,"tag":103,"props":104,"children":108},"a",{"href":105,"rel":106},"http://vision.stanford.edu/aditya86/ImageNetDogs/",[107],"nofollow",[109],{"type":52,"value":110},"Stanford Dogs dataset",{"type":38,"tag":97,"props":112,"children":113},{},[114],{"type":52,"value":115},"The model is converted into a model TensorflowJS can consume and labels are outputted as a JSON file",{"type":38,"tag":97,"props":117,"children":118},{},[119],{"type":52,"value":120},"The model and labels are used in the Next.js application to classify images on the client",{"type":38,"tag":39,"props":122,"children":123},{},[124],{"type":38,"tag":43,"props":125,"children":127},{"alt":75,"src":126},"https://github.com/ryanachten/whosagoodboy/raw/main/docs/wagb_upload.png",[],{"type":38,"tag":39,"props":129,"children":130},{},[131],{"type":52,"value":132},"Then when a user uploads a photo, we are able to do the following:",{"type":38,"tag":93,"props":134,"children":135},{},[136,141,146,151],{"type":38,"tag":97,"props":137,"children":138},{},[139],{"type":52,"value":140},"Crop the photo so that it uses a square aspect ratio and then resize it to dimensions which are acceptable for classification",{"type":38,"tag":97,"props":142,"children":143},{},[144],{"type":52,"value":145},"Pass transformed photo to the Tensorflow model to predict what breeds are most likely associated with the photo",{"type":38,"tag":97,"props":147,"children":148},{},[149],{"type":52,"value":150},"Classification results are mapped to outputted labels to identify dog breeds predictions",{"type":38,"tag":97,"props":152,"children":153},{},[154],{"type":52,"value":155},"Use Wikipedia to provide general information on the dog breeds being classified",{"type":38,"tag":39,"props":157,"children":158},{},[159],{"type":38,"tag":43,"props":160,"children":163},{"alt":161,"src":162},"Gallery","https://github.com/ryanachten/whosagoodboy/raw/main/docs/wagb_desktop_gallery.png",[],{"type":38,"tag":79,"props":165,"children":167},{"id":166},"running-whosagoodboy",[168],{"type":52,"value":169},"Running whosagoodboy",{"type":38,"tag":39,"props":171,"children":172},{},[173],{"type":52,"value":174},"Documentation for running different parts of the app can be found here:",{"type":38,"tag":176,"props":177,"children":178},"ul",{},[179,189,199],{"type":38,"tag":97,"props":180,"children":181},{},[182],{"type":38,"tag":103,"props":183,"children":186},{"href":184,"rel":185},"https://github.com/ryanachten/whosagoodboy/raw/main/app/README.md",[107],[187],{"type":52,"value":188},"Client and backend Next.js app ",{"type":38,"tag":97,"props":190,"children":191},{},[192],{"type":38,"tag":103,"props":193,"children":196},{"href":194,"rel":195},"https://github.com/ryanachten/whosagoodboy/raw/main/model/README.md",[107],[197],{"type":52,"value":198},"Tensorflow model",{"type":38,"tag":97,"props":200,"children":201},{},[202],{"type":38,"tag":103,"props":203,"children":206},{"href":204,"rel":205},"https://github.com/ryanachten/whosagoodboy/raw/main/infra/README.md",[107],[207],{"type":52,"value":208},"Terraform infrastructure",{"title":7,"searchDepth":210,"depth":210,"links":211},2,[212,213],{"id":81,"depth":210,"text":84},{"id":166,"depth":210,"text":169},"markdown","content:projects:whosagoodboy.md","content","projects/whosagoodboy.md","projects/whosagoodboy","md",1776573205290]