概要

mdx.jpを用いてYOLOv11のクラス分類(くずし字認識)の学習を行う機会がありましたので、備忘録です。

データセット

以下の「くずし字データセット」を対象にします。

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

データセットの作成

yoloの形式に合致するようにデータセットを整形します。まず、書名ごとに分かれているデータをフラットにマージします。

#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]}"

次に、以下のようなスクリプトにより、データセットを分割します。

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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,086,326画像のデータセットが作成されました。

Ultralytics HUBの利用(失敗しました。)

まず、Ultralytics HUBの利用を考え、データセットにアップロードを試みましたが、以下のようにエラーが出てしまいました。データセットの作成方法に誤りがあるのかなど、原因が分かりかねました。

mdx.jpのオブジェクトストレージへのアップロード

以下のようなコマンドにより、データセットをオブジェクトストレージにアップロードします。

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

参考:初期設定

以下に公式のマニュアルがあります。

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

sudoaptinstalls3cmd
sAASDUSUiDEPUHTPSNNS3ccees3sfNnasTeluooaccccfeeScteTsecwtvmeeraEt-rhPtacedsseu"n"hsyHsevcsstlsd%etptTPaeseost3p(ytoTrcsrne-kKK.obtliPocw.iftceeeRaiuaeoGSxeafitoyyyemncrnPysiYygin::gatkgbGpstoiunfaizeeuprs,unrginoo[ttcapoewrgesgd((nns)ksrtriad?ua3sSesoovttat.rS[w..3twgcehtch[eeUsas+ororecaNycS.m3shralsmete/r]ca.yodmnupsNe:ozass:[aptsee]t)momtt[Ympinr"naen/eelnkckuazmaus:igermye)sfwoms]eyyiy-osnser:dtpner.au:/oatdaacwppbcni.rsSospoirldoet3m.ornein-]crt/dssy1E:otgetewonmstpncoud"egtarrrpsdm]ileko3tnp:altsiidosll.dnsasbk.et.tbt?ue.nmhaecytades[kinxefYewfd.tdo/toijarnsrenprb].krogua.estecc.dtkcfmeefooAtsirdmssnia.ieAfznmyog:an-zia)otSn3bt.u<Soc=3"k=.t%eh(tLebeu[atc%vak(erebOgtuKte)chtske"emAtma)eansmzd.postn"3y%.S(af3lmo.oarczaoutnsiaiownnsg).sct"ohmev]a:ernsvsc3vadansr.ibmaedbxlu.esjsep.d

アップロード

s3cmdput()s3://()

ダウンロード

s3cmdgets3://()/()

mdx.jpでの操作

mdx.jpの1GPUパックを利用します。

以下のようなコマンドにより、データセットをオブジェクトストレージからダウンロードします。

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

そして、以下のようなスクリプトにより、学習を実行します。

f#m#mroooYddmOeeLllde#buO.apalv=ttoitt8racmcrYa=hghaOi'ss=lLn/=z2yO(h1=5t(o026i'm,2cye4so/,lmiodm1xp1uoxsr-etcrl/YsyO.oLplOto'/)spl##i#t#N_adnaotaset_full',#

ssh接続が切れても学習を継続できるように、tmuxを使います。

tpmyutxhonnewyo-usr_mtyr_atirnaiinngi_nsgc_rsiepsts.ipoyn

実行後、以下のようなチェックが走ります。

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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

「Ultralytics HUB: View model at 」のURLを参照することで、学習経過を確認することができました。

バッチサイズ

当初、batchサイズを未指定で実行していました。デフォルトは16のようですが、以下のように、GPUのメモリ使用量が低い状態でした。

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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

A100の40GBメモリを活かすために、batchサイズを256に変更しました。結果、以下のように1エポックあたりの実行時間を短縮することができました。

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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

参考:tmux

tmuxで現在のセッション一覧を表示する

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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

特定のセッションに再接続する

defsi#c#fppflorlariiosntssccf#rtvtvt#ft(.selliararaeo(sphssalnalalsr"eausedi_i_tltt=issonenf_sso#ffhin_m_n_ifppso,.l[d=.edflill.re.dtisnieliimixrqr[hd=lsettafsnimfdoues,_kihpstom=sf=is=deluutrr(.fn=sidettsecoplit=fprii_(edlsaen(iflrildo(a.t(tlflii=sn.iuoisphf(eielt(crtunsa.ilnlse_osso,ptetjle(e[sfsppp"uposhoenfst[i.lly)otus).is(i[rvlpii(u_t.:jn)fl:aaeattftd_lo(ietilst__ipidiiclsrn_hdflurisnle)a_ei.iiet)rt(asiennjrl,_:)dis)nndo,edins_d:zisoirp_(e:]ine:sr(udtnvp(x.,ititrda(oipn_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

tmuxセッションから抜ける(デタッチする)

Ctrl + b を押してから d を押します。

学習結果

学習結果のモデルは、以下のHugging Faceのスペースからご利用いただけます。

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

精度については、改善の余地があるかと思いますが、以下のように、正しく結果を返却してくれるケースもありました。

上記では、以下の文字画像を利用しています。

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

まとめ

yolo, mdx.jpなどを使った学習の参考になりましたら幸いです。