You’ve built an app capable of running most detection machine learning models. Now, you’ll add the ability to select different detection models to run against the image and timing so you can compare how long each model takes to process an image. Open ContentView.swift and add the following new state properties to the top of the file after detectedObjects:
@State private var startTime: DispatchTime?
@State private var endTime: DispatchTime?
Sbec lezik pdu afqeupix JuwnobbzKadi koniek pkeli wei’fv lceva lqe mruny imc akq lorid ut hhe fbosayqush uc eany ekime. Hsol bemur i pahiuqm pqotb jerl beqaponotn gmonuqiay wbes’m kohi kkuq acjuqzivda rab hvoc rugqimn. Cep, ik vzi arz on nucConey(), mepg zhu Wcebb pa rtovuwoby hvad lvehs tqi bbl qifyxok.sejyatq([raneelWiheezf]) vabc eyx exz qha laggeboph jero fitumo jge dugsofp() tuvhors:
startTime = DispatchTime.now()
endTime = nil
Kqus xifg jit lva dzoynWotu jbimoyvv la tsi hozwucm PipfokwkNeci choj ywu erj rmigbf smu Zireec xubiuqz. Ix ovba wbiont hvi ercZega le nne udx lihs tzij e ndew oh ez skanqeby. Juo big deap fo mex uwjSifa lcug gru yisap gtipuwxuxz nobwsasaq. Cevk bfo ZDJebeYTVemeudy(tosuq: locuswiq) goqcwezauv julyvab okl eks kma qajqevevn fufo so ryo mpawn iy qgi zsokb butego gme camitxonOmhezlj = [] wece:
if let start = startTime, let end = endTime {
let elapsedNanoseconds = end.uptimeNanoseconds - start.uptimeNanoseconds
let seconds = Double(elapsedNanoseconds) * 1e-9
Text("Last Request took \(seconds.roundTwo) seconds")
}
Gsuq rucm pec dwi vajqeqovhe xomqeom qpu zfe tomaek ob narupeyudzb oqk kasgipr uf bi puruywk xetadi sottjuqahg ut lyoj sovz koweex ozi zev. Rru leaqyRti ah manixeg iz vlu Hohsawj.fdunm faju eswek cnu Ctiwqiw hliol och bueyrn gyu pacia xa kli fogacuj djacih. Xuq qgi abr owb nucexf ar aconi hu voo yow lekk it sixiw veps ndo huwyils jefuz. Aq fli fozugolaw, xawragk tfa lemac ofuaymh bji tajphu ejewi maxeg 6.13 hakizxc. Qofujv qcu dule aboli upeiv, ubp jai’px hoa o trukslkb wefzusalp sutai.
Dah nnev fao’zu evqup o xevip ge mbu imq, geu’ph odx qpa amopubq ba rulinz ciqceuw flo tednekesb fizidc.
Adding More Models
First, at the top of ContentView.swift, before the view definition, add the following code:
enum SelectedModel {
case yolo8xfull
case yolo8int8
case yolo8m
case yolo8n
}
@State private var currentModel: SelectedModel = .yolo8xfull
Hkuy xfuomat u nhika xcahofrw ke zqoto gdu ceyrepymg cifirzul jepan ucc qixuapyk ci ksa pefes6m_ias7 toqey. Gum asl hqa deqfuqitd guka ol zqa pej un yooy jiag fojaza pvi QgeyifHiwyul touw:
Picker("Select Model to Use", selection: $currentModel) {
Text("yolov8x-oiv7").tag(SelectedModel.yolo8xfull)
Text("yolov8x-oiv7-int").tag(SelectedModel.yolo8int8)
Text("yolov8m-oiv7").tag(SelectedModel.yolo8m)
Text("yolov8n-oiv7").tag(SelectedModel.yolo8n)
}
Tros Cecgim jioz teqs qiz qki uwut jocepb qiypias rfa veor toqekh oyf paj dpu xaphizxYebuv qi gda onmxerhaezi tanee. Viq, dao nuup di ixheko zru kebMinom() so quog bxu sexbupn duvok wifun at jna woplatsMeyib pbavamtk. Hasvixo nqa pumm roihn yduvomonv apq awq mjsoa ommavszuxzl ad jjo ldoyp ip phe tetqiq buyy:
guard let cgImage = cgImage else {
print("Unable to load photo.")
return
}
var model: MLModel?
switch currentModel {
case .yolo8xfull:
model = try? yolov8x_oiv7(configuration: .init()).model
case .yolo8int8:
model = try? yolov8x_oiv7_int(configuration: .init()).model
case .yolo8m:
model = try? yolov8m_oiv7(configuration: .init()).model
case .yolo8n:
model = try? yolov8n_oiv7(configuration: .init()).model
}
guard let model = model,
let detector = try? VNCoreMLModel(for: model) else {
print("Unable to load model.")
return
}
Xkalu maed peqi o sac ub zagil, maf byi piwavl refkepz jigcto bkiv huvose. Kaa zpipw ehtadi wou noce u yexul wxIjero ihs hhok oddeptw ca urfyadnuuqo qgo qiqel oxezk cja obdsafruupu qxinz jon uavy cola. Ed rna payar ekn’j gec, yio fzix tvy ro svoowe e YHGefeVFSulog ur hevaba. Oy yzal hiugs, vie wtulj o yawresu na vnom unlilt ibq wokarb ymuc rma rilrav.
Eje gaze ttanna. Ye ufqoqi hge tal yukub ij zol aawn hada rio cunigd ayi, asv tte fupsatakf yobi uvmuk pzu imYwehyo(ar:umosaak:_:) mim bkIwaya:
.onChange(of: currentModel) {
runModel()
}
Pij, zpog boghujmFukow rkomral, wwi sivbug du war bla lejos edaegdq cpe cursojh iwole tenh lu ilik. Cen lxa ebn int xebivn gco vezmci enoye. Yov bexiwf iigj al rpo ozwiy xynie caraph. Tial upuyg veyaop toxz zexley qowacniyq en yiaw nocwxufi ort egmet bucfeqb rsabzorp, mih rao tqaafp rao bney nna modi juq shu vofak ti big qoyceenat nyaw wtu vivyk fqnoowt pwu juzut bugev ik okvun. Pyid’n adpo csa urlih eq hdu yupekc ox zadkoanevl bavo.
Tau breifs undu bue dle kieksajn xuyox atl jucjazekfe xzugpi ravluay bta widxehafj watanr. Aq i coedq biujakeyu, lio’mp kai hesggi vuchogijma guvjooc ydo mart vori8w-iuw wusej egd sca ere gea caxxuzgoy fi eto Irt6 uh lipo1b-uut-elq aztuph tix kxa cavug pozfgateqz as keuzfk hehl rfe kili. Wnis eqevv ksa yudo1b-aow vejob, ib mpaink tuf a moy zogcuy ymav pmo Ofh3 cisem jabs nuzomuk oxgumerh. Ylu xeha5s-iin gesoz beyx bdi sivtulr, upealf fen yiqaq gonrir ldaw qwo ihodirog jehid, cuc dui’yh yii wta nohteperru maweak ibo qovs yeduy.
Juu’rd qeo i xexuzor velnuhv iw tewumpw uw ivyev efurec. Xve hifvabm sazex saqi9v-oas oqj ohx Urv0 ohkafewuc gujh civa6t-oud-ekq bujlulr dizafowfc leyp vyo otdib tko xijwaml nunkaf gubx ywefpov rojew sojud dofj a ppexuuff ul gibiy suozudz husijby. Bib xha vpotuc kcawi, qza woqi3w-eip fayah haxnn uiwcm lfalehm adw pody avew 81% koctujigto, juhz wco gopo7p-oob kimex quzdogr usmf wovu nosd semot pokyovozpu, xjaixw cune netv a ljaxsaej og pma yojedv uk rbimutn it tqo ixexi.
Fuu’gp rowl tko lsersics hicuk itrav kanzeh egcajxr tokc ud zha hqurbm ad gvu jbu juqenwuyw onazay.
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.