Overview

I had the opportunity to train YOLOv11 classification (kuzushiji recognition) using mdx.jp, so here are my notes.

Dataset

The following “Kuzushiji Dataset” is used as the target.

http://codh.rois.ac.jp/char-shape/book/

Dataset Creation

The dataset is formatted to match the YOLO format. First, data separated by book title is flattened and merged.

#c|laesxsdpeoCfrltac#f#fsriose"loria.euft.stfcoi#osie/pilufshc_d=ulstp.uadatepormttatg_=usciaiitaldit.onkloa/oinf_pnte.ns*brifat(dc:e/(tlitifiotci=qelhn"rp(hnd.e.uCsysap"mseeo((eru.(p=xpfflat.fliy"ifc_/iifsi{l,tfdlt"tnoeeiae({sgu,irlts"o(tnsea)/uo{pop/_/:"tufuuu*pd)ptittt/aa[upl_p_*tt-tueduf.ha2_t}itij)s]d_r_lpeift}fegtrio/i_""}l{lp/e{cea{)ol)tc:ushlt},sp"}u,o/tu{_etffxpiiiullsteet_.}_ds"oip)krl=)iT:tr(u'e/)')[-1]}"

Next, the dataset is split using the following script.

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

As a result, a dataset of 1,086,326 images was created.

Using Ultralytics HUB (Failed)

First, I considered using Ultralytics HUB and attempted to upload the dataset, but the following error occurred. I was unable to determine the cause, such as whether there was an error in the dataset creation method.

Uploading to mdx.jp Object Storage

The dataset is uploaded to object storage using the following command.

s3cmdsyncdata/split_dataset_full.zips3://satoru196/dataset/

Reference: Initial Setup

The official manual is available at the following link.

https://docs.mdx.jp/ja/index.html#オブジェクトストレージの利用方法例

sudoaptinstalls3cmd
sAASDUSUiDEPUHTPSNNS3ccees3sfNnasTeluooaccccfeeScteTsecwtvmeeraEt-rhPtacedsseu"n"hsyHsevcsstlsd%etptTPaeseost3p(ytoTrcsrne-kKK.obtliPocw.iftceeeRaiuaeoGSxeafitoyyyemncrnPysiYygin::gatkgbGpstoiunfaizeeuprs,unrginoo[ttcapoewrgesgd((nns)ksrtriad?uEEa3sSesoovttat.rSnn[w..3twgcehtch[eettUsas+ororecaNyceeS.m3shralsmete/rrr]ca.yodmnupsNe:ozass:[aptsee]tasmomtt[Ympinrce"naen/eelnkckccuazmaus:igermyeersfwoms]eyyiyse-osnser:dtpnster.au:/oatdaacwppbcni.rkksSospoirldoeeet3m.orneinyy-]crt/dssy))1E:otgetewonmstpncoud"egtarrrpsdm]ileko3tnp:altsiidosll.dnsasbk.et.tbt?ue.nmhaecytades[kinxefYewfd.tdo/toijarnsrenprb].krogua.estecc.dtkcfmeefooAtsirdmssnia.ieAfznmyog:an-zia)otSn3bt.u<Soc=3"k=.t%eTh(thLebieu[satc%vak(merebegtuate)cnhtskse"emAtima)teans'mzd.spostn"3Oy%.KS(a!f3lmo.oarczaoutnsiaiownnsg).sct"ohmev]a:ernsvsc3vadansr.ibmaedbxlu.esjsep.d

Upload

s3cmdput(filename)s3://(bucket-name)

Download

s3cmdgets3://(bucket-name)/(object-key-name)

Operations on mdx.jp

A 1 GPU pack on mdx.jp is used.

The dataset is downloaded from object storage using the following command.

su3nczmidpgseptlist3_:d/a/tsaasteotr_uf1u9l6l/.dzaitpaset/split_dataset_full.zip

Then, training is executed using the following script.

f#m#mroooLdDdmoeaealtlde#buda.apal=sttoittYeracmcrOYta=hghaLOi'ss=lOLan/=z2yvOn(h1=5t8(do026i'm,2ccyte4slor/,alamisoidms1nxpi1iuofxnsri-getccralc/YtsoyOi.noLopflOntio'g/m)usorpdal#e#ti#litN#No_uBandmIanabntotepc-aruhsstieosztfiie_mzfeaecupglloealcos'hsps,sitizifeoi#ncaaDlta)itoansemtodpealth

To continue training even if the SSH connection is lost, tmux is used.

tpmyutxhonnewyo-usr_mtyr_atirnaiinngi_nsgc_rsiepsts.ipoyn

After execution, the following checks are run.

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

0

You can check the training progress by referencing the URL from “Ultralytics HUB: View model at”.

Batch Size

Initially, the batch size was left unspecified. The default appears to be 16, but as shown below, GPU memory usage was low.

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

1

To take advantage of the A100’s 40GB memory, the batch size was changed to 256. As a result, the execution time per epoch was reduced as shown below.

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

2

Reference: tmux

Display the list of current tmux sessions

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

3

Reattach to a specific session

defsi#c#fppflorlGaSriioespntstslccf#rtvtvt#ft(.seilliararaeo(sphcstsalSnalalsCr"eaulsehdi_i_trDltta=aissuonenf_esso#fafhisnn_fm_n_ifappsot,.ls[dd=f.edflitll.Crae.dtilsnieleiimoixrdsqr[ehd=lsettapfssnimifadouess,_kyihppstrovm=saf=is=adelulutrere(.nfn=vsidfetitseccopdlit=fepriiit_(etddlsaen(iflrliltdo(oaa.ts(tlflidi=sen.iiuoritsphpf(eielit(scnrtuinasa.lilnlser_ossog,pteetjile(e[sefspppupsoshotenfst[ci.llycotus).is(i[rvtlpii(ou_t.:jn)fl:aaoeattfmtd_lo(ietilrst__ippidiiclsrn_ihdfllurisnle)a_eei.iieet)rt(asiensnjrl,t_:)dis)nndo,eedins_d:zisodirp_(e:]ine:s.r(udtnvp(x.",ititrda(oip)n_rra]l[usatpd,ai_"tttruiinetp_hatrfn_nruo.i_,)_rdatkjndra]i_=o_icfatndTirrloti"irna)srio,ru(t)o,esiif)")pofvslivapi=onalltsl"i_0.o_,td.psr,i7a.a"r,tlttc,hiielv.sossoait)t)slsd)"._di]prir,aar(tt(c[hiolt.osarb.saa=psisa_ne0td_n.hifa1.rim5j)le)oe(:iisfnf,i(liovensa)p.l)up_)taf_tidhli.eris,s,fdit)le)es](to_sf.iplaetsh].)j:oin(class_dir,f))]

4

Detach from a tmux session

Press Ctrl + b, then press d.

Training Results

The trained model is available from the following Hugging Face Space.

https://huggingface.co/spaces/nakamura196/yolov11x-cls-codh-char

There is room for improvement in accuracy, but there were cases where it returned correct results, as shown below.

The character images above are from the following source.

https://mojiportal.nabunken.go.jp/

Summary

I hope this serves as a useful reference for training using YOLO, mdx.jp, and other tools.