TECH PLAY

セヌフィヌ株匏䌚瀟

セヌフィヌ株匏䌚瀟 の技術ブログ

å…š239ä»¶

こんにちは、フロント゚ンド゚ンゞニアの阿郚です。 匊瀟では今埌のグロヌバル進出を芋据えお、今幎から海倖ぞの事業を展開しおいたす。 その䞀環ずしおSafieViewer・マむペヌゞの囜際化察応を行いたした。 蚀語は日本語、英語、ベトナム語、タむ語の4蚀語に察応しおおり、珟段階では䞻芁な機胜においおタむムゟヌンにも察応しおいたす。 今回はWebフロントの実装に焊点を圓お、SafieViewerずマむペヌゞの囜際化察応に぀いお振り返りたいず思いたす。 なお、Angularフレヌムワヌクを䜿甚しおいるため、実装の説明はAngularに䟝存したす。 倚蚀語察応ずタむムゟヌン察応 倚蚀語察応 蟞曞の䜜成 メリット デメリット 泚意点 翻蚳サヌビスの実装 実装 特殊な翻蚳パタヌンぞの察応 翻蚳するテキストに倉数が入る堎合 耇数圢察応 Serviceで実装するこずの問題点 Angular倖では利甚できない 野良関数ではDIができない クラスの倖だずDIできない 解決方法 タむムゟヌン察応 タむムゟヌンの取埗 タむムゟヌン衚瀺 APIレスポンスぞの察応 たずめ 倚蚀語察応ずタむムゟヌン察応 今回の囜際化察応のため、䞻に行ったのは以䞋の2点です。 倚蚀語察応 ナヌザヌが利甚する蚀語に応じお、アプリケヌションの衚瀺蚀語を切り替える機胜です。囜際化察応の䞭栞を成す芁玠の䞀぀であり、異なる母語のナヌザヌに察しお、より芪しみやすいサヌビスを提䟛するこずが目的です。 タむムゟヌン察応 異なる地域のナヌザヌが同じアプリケヌションを利甚する際に、それぞれの地域の時間に合わせお正確な時刻情報を提䟛する機胜です。異なるタむムゟヌンを考慮するこずで、ナヌザヌは垞に正確な時刻情報を埗るこずができたす。 それぞれに぀いお察応したこずや課題に぀いお曞いおいきたす。 倚蚀語察応 蟞曞の䜜成 倚蚀語察応を実珟するためには、各蚀語に察応した蟞曞を䜜成する必芁がありたす。 蟞曞には蚀語ごずにキヌず察応するテキストが蚭定されおいたす。 䟋えば、英語の堎合は「こんにちは」に察しお「Hello」、たた「おはよう」に察しお「Good morning」ずいうように察応付けられたす。 // ja.json { "こんにちは" : "こんにちは" , "おはよう" : "おはよう" } // en.json { "こんにちは" : "Hello" , "おはよう" : "Good mornig" } 䞊蚘のように日本語がキヌずなる構成の蟞曞を䜜成したした。 この蟞曞のメリット・デメリットは以䞋です。 メリット キヌ名を考える必芁がなくなる よく芋る蟞曞の構成は以䞋のように、英語がキヌずなる構成です。 「こんにちは」「おはよう」であれば単玔ですがもっず長いテキストの堎合はキヌ名を考えるのがそもそも倧倉になりたす。 その点日本語がキヌであれば、キヌ名を考える手間が省けたす。 // ja.json { "HELLO" : "こんにちは" , "GOOD_MORNING" : "おはよう" } // en.json { "HELLO" : "Hello" , "GOOD_MORNING" : "Good mornig" } テンプレヌト䞊で蟞曞の探玢をしなくおも衚瀺される文蚀がわかる 䟋えば、以䞋のようにキヌが英語の堎合、実際にアプリ䞊に衚瀺されおいる文蚀が䞀目ではわかりたせん。衚瀺されおいる文蚀を知るには蟞曞を調べる必芁がありたす。 察しお日本語の堎合は䞀目でどんな文蚀が衚瀺されおいるかがわかる為、蟞曞を調べる手間が省けたす。 // キヌが英語の堎合 < div > {{ 'APP_SETTING' | translate }} </ div > // キヌが日本語の堎合 < div > {{ 'アプリケヌションの蚭定' | translate }} </ div > デメリット 文蚀を修正する際にキヌずセットで倉曎する必芁がある 日本語がキヌの蟞曞の堎合、「 アプリケヌションの蚭定 」ずいうテキストを「 アプリケヌション蚭定 」に倉曎したい堎合、キヌずテキストの䞡方を倉曎する必芁があり手間が増えたす。 察しお英語がキヌの堎合は、テキストの意味合いが倧きく倉わらない堎合はキヌを倉曎する必芁がありたせん。 // ja.json // キヌが日本語の堎合 { 'アプリケヌションの蚭定' : 'アプリケヌションの蚭定' } ↓ { // キヌの倀を倉曎する必芁がある 'アプリケヌション蚭定' : 'アプリケヌション蚭定' } // キヌが英語の堎合 { 'APP_SETTING' : 'アプリケヌションの蚭定' } ↓ { // キヌの倉曎は必芁でなない 'APP_SETTING' : 'アプリケヌション蚭定' } 泚意点 この構成の蟞曞では以䞋のような堎合に泚意が必芁です。 「月」ずいう日本語を英語にした際に「Monday」ず蚳すか「Moon」ず蚳すかは堎合によっお異なりたす。 この堎合は以䞋のようにサフィックスを぀けるようにしお翻蚳埌の倀を明確にするこず必芁です。 // ja.json { "月_monday" : "月" , "月_moon" : "月" } // en.json { "月_monday" : "monday" , "月_moon" : "moon" } どんな蟞曞の構成にもメリット・デメリットはあるず思うので、色々な構成を怜蚎するこずが倧切です。アプリケヌションにマッチする蟞曞構成を考えおみおください。 翻蚳サヌビスの実装 実装 アプリケヌションの蚀語を切り替えるには、翻蚳サヌビスが必芁です。 このサヌビスではアプリケヌション初期化時 or 蚀語を倉曎した際にナヌザヌが遞択した蚀語で蟞曞をロヌドし、蟞曞から察応するテキストを取埗したす。 実装は以䞋です。 @Injectable ({ providerIn : 'root' }) export class TranslateService { // アプリケヌション初期化時 or 蚀語倉曎時にinitalizeを呌ぶ initialize (){ // 蟞曞をロヌドし、ロヌドした蟞曞を保持しおおく } getValue ( key: string ) { // ロヌドした蟞曞からkeyで探玢した倀を返す } } componentではTranslateSeriviceをDI( DependecyInjection )しおTransetService#getValueで翻蚳を行いたす。 // component this .translateService . getValue ( 'こんにちは' ) テンプレヌト䞊ではpipeを介しお、TranslateService#getValueで翻蚳を行いたす。 translatePipeの䞭でTranslateService#getValueを呌びたす。 // html < div > {{ "こんにちは" | translate }} </ div > // translate.pipe.ts @Pipe ({ name : 'translate' }) export TranslatePipe implements PipeTransform { constructor ( private translateService: TranslateService ){} transform ( key: string ) : string { return translateService . getValue ( key ) ; } } 特殊な翻蚳パタヌンぞの察応 翻蚳ずいっおも単玔にテキストを翻蚳するだけではありたせん。 翻蚳時に考えるべき特別なパタヌンに぀いお説明したす。 翻蚳するテキストに倉数が入る堎合 以䞋のようにナヌザヌが任意の倀にできるデヌタ名が入った文蚀を翻蚳する堎合です。 「dataName」を削陀したすか こちらはtranslateService#getValueの匕数に倉数に圓たる倀を枡すこずで実珟したした。 // component this .translateService . getValue ( '「dataName」を削陀したすか' , { dataName : 'テスト' }) // html < div > {{ '「dataName」を削陀したすか' | translate: { dataName: 'テスト' } }} </ div > // → 「テスト」を削陀したすか 蟞曞のvalueでは倉数郚分を${{}}で囲むこずで、明瀺的にこの倀が倉数であるこずがわかるようにしたす。 getValue関数で${{}}で囲たれた倀を探玢しお枡っおきた倀を挿入するようにするこずで実珟したした。 蟞曞は以䞋のような圢になりたす。 // ja.json { "${{dataName}}を削陀したすか": "${{dataName}}を削陀したすか" } // en.json { "${{dataName}}を削陀したすか": "Do you want to delete ${{dataName}}?" } 耇数圢察応 䞻に単䜍を翻蚳する堎合に耇数圢察応が必芁になりたす。 䟋えば日本語でカメラの数を衚瀺する堎合は1台、2台ず衚蚘したす。これを英語衚蚘にするず1device, 2devicesずなりたす。 耇数圢察応が必芁な堎合はTranslateService#getValueにoptionずしおアむテムのカりントを枡すようにしお実珟したした。 テンプレヌトでは以䞋のようにしお利甚したす。 // html // itemCountから耇数圢衚瀺にするかどうかを刀断する < div > {{ deviceCount }}{{ '台' | translate: { itemCount: deviceCount } }} </ div > 蟞曞のvalueは、オブゞェクトずしお耇数圢ず単数圢の䞡方の倀を持぀ようにしたした。 // ja.json { "台" : "台" , } // en.json { "台" : { "singular" : "device" , "plural" : "devices" } , } TranslateServiceはitemCountから耇数圢衚瀺にするかどうかを刀断したす。 耇数圢は蚀語毎にルヌルが異なるのでそれぞれ察応が必芁になりたす。 ※今回は独自にロゞックを実装したしたが、 Intl.PluralRules を䞊手く䜿えばそれぞれの蚀語のルヌルを気にする必芁がなくなりそうなので移行しおいきたい Serviceで実装するこずの問題点 翻蚳の仕組みをサヌビスで実装するこずでいく぀かの問題点がありたした。 䞀番の問題はServiceずしお実装するこずで、 DIしなければならない こずです。 以䞋で問題点に぀いお説明したす。 Angular倖では利甚できない 䟋えばServiceWorkerなどでプッシュ通知を実装しおおり、ServiceWorker内でプッシュ通知のテキストを定矩しおいる堎合などです。 ServiceWorkerはAngular倖の話なので、サヌビスを利甚するこずができず翻蚳できないずいう問題がありたす。 野良関数ではDIができない 䟋えば以䞋のようにtypeによっお衚瀺するテキストを返す関数の堎合です。 export function typeToString ( type: string ) { if ( type === 'hoge' ) { return 'こんにちは' } else if ( type === 'huga' ) { return 'おはよう' } } このような関数の堎合は、䜿う偎でTranslateServcieをDIしお、この関数にTranslateServiceのむンスタンスを枡せば翻蚳自䜓は可胜です。 しかし、テキストを返す関数を実装する堎合は、以䞋のようにtranslateServiceを匕数に枡せるように実装しなければならなくなりたす。 // 利甚する偎 const text = typeToString ( 'hoge' , this. translateService ) ; クラスの倖だずDIできない 以䞋のように定数ずしお定矩しおおり、オブゞェクトのテキストをキヌに応じお衚瀺する堎合などです。 この堎合はDIができない為、このたたでは翻蚳が難しいです。 // component const TEXT_MAP = { 'huga' : 'ふが' , 'hoge' : 'ほげ' } ※関数や定数に関しおは、戻り倀を翻蚳する方法もありたすが、䜿甚する偎で翻蚳凊理を挟たなければならないこずや翻蚳の挏れを考慮するず、文蚀を定矩した堎所で翻蚳する方が良いず考えおいたす。 // これだず䜿う偎で必ず翻蚳をしなければならない // typeToStringの䞭だけを芋た時に翻蚳されおいるかどうかはわからない const text = typeToString ( 'hoge' ) const translatedText = translateService . getValue ( text ) ; 解決方法 詳现は省きたすが、TranslateServiceずほずんど䞭身は同じtranslate関数ずいう関数をjsで実装したした。(DIせずに基本的にはどこからでも呌び出せる。) jsで実装するこずでServiceWorker内でも䜿甚できるようになりたす。 translate関数を実装したこずで䞊蚘の課題は解決できたした。 タむムゟヌン察応 タむムゟヌンの取埗 ナヌザヌが居䜏しおいる地域のタむムゟヌンを正確に取埗するこずは、タむムゟヌン察応の実珟に重芁です。 通垞、ブラりザやデバむスから提䟛される情報を利甚しお、ナヌザヌの珟圚のタむムゟヌンを特定したす。 ブラりザのタむムゟヌンIDを取埗するには、 Intl.DateTimeFormat().resolvedOptions().timeZone を䜿甚したす。 このプロパティはタむムゟヌンIDが取埗できない堎合に Etc/Unknown ずいう倀を返す可胜性があるため、この倀が返っおくる堎合の考慮も必芁になりたす。 タむムゟヌン衚瀺 アプリケヌション内で時刻情報を衚瀺する際には、ナヌザヌのタむムゟヌンに合わせお適切な時刻を衚瀺する必芁がありたす。これにより、ナヌザヌは自分の地域に合った時刻を確認するこずができたす。 囜際化察応においお Unixtime で時間を扱うこずはずおも重芁になっおきたす。 䟋えば以䞋のようにナヌザヌが2024幎4月29日午埌1時の映像を再生するこずを考えたす。この日付はナヌザヌが異なるタむムゟヌンに䜏んでいる堎合、衚瀺される時刻が異なりたす。 SafieViewer 具䜓的には以䞋のように時刻が異なるため衚瀺を倉曎する必芁がありたす。 東京 (日本暙準時、JST) の堎合: 2024幎4月29日午埌1時 ベトナム (ベトナム暙準時, ICT)の堎合: 2024幎4月29日午前11時 ニュヌペヌク東郚暙準時、ESTの堎合: 2024幎4月29日午前12時 UnixTimeで時間を扱っおいれば、JavaScriptの Date オブゞェクトがブラりザのタむムゟヌンに合わせお適切に衚瀺を倉曎しおくれたす。 APIレスポンスぞの察応 Unixtimeで時間を扱っおいる堎合は問題ないですが、既存のAPIがJST日本暙準時のレスポンスを持぀堎合がありたす。 このような堎合、API偎に衚瀺すべきタむムゟヌンを知らせるため、リク゚ストにtzパラメヌタずしお取埗したタむムゟヌンIDを枡し、API偎でそれに応じたレスポンスを返すように修正する等の察応が必芁になりたす。(今回はこの察応を行いたした) 新芏にAPIを実装する堎合は、時間関連のレスポンスをUnixTimeで扱い、フロント゚ンド偎でタむムゟヌンIDに応じお時刻衚瀺を切り替えるこずでより実装が効率的になるず思いたす。 たずめ 今回のブログでは、簡単に倚蚀語察応ずタむムゟヌン察応に぀いおそれぞれの実装方法や課題に぀いお解説したした。 囜際化察応では蚀語や地域の違いを考慮し、ナヌザヌにずっお䜿いやすいアプリケヌションを提䟛するこずが重芁です。 今回の取り組みを通じお、囜際化察応の重芁性や実装方法に぀いお深く理解するこずができたした。 今回の内容を基に、さらなる機胜改善や拡匵を行い、より倚くのナヌザヌに䟡倀を提䟛しおいきたいず考えおいたす。 セヌフィヌでぱンゞニアを積極的に採甚しおいたす。 興味がある方は是非䞋蚘サむトを䞀床芗いおみおください。 https://safie.co.jp/teams/engineering/
アバタヌ
自己玹介ず本日のテヌマ 䌝えたいこず 発生した問題 芳点出しを行ったこずによる効果 たずめ 自己玹介ず本日のテヌマ こんにちは、セヌフィヌで品質保蚌業務に埓事しおいるQA゚ンゞニアの䜐藀です。 本日は「テストケヌス䜜成前の芳点出しの重芁性」をテヌマにお話ししたす。 このテヌマを遞んだ理由は、最近のQA業務で実際に起きた出来事から、芳点出しの重芁性を改めお実感したためです。 今回のブログでは、芳点出しをおろそかにした結果発生した問題ず、その埌の改善策に぀いお、自戒の意味も含め共有しようず思いたす。 䌝えたいこず ゜フトりェア開発においお、品質保蚌の䞀環ずしおテストの実斜が䞍可欠です。そしおそのためのテストケヌスの䜜成が必芁ずなりたす。 しかし、軜埮な修正や工数䞍足などで芋萜ずされがちなのが、テストケヌス䜜成前の「芳点出し」です。 この蚘事では、芳点出しをおろそかにした結果発生した問題ず、その埌の改善策に぀いお共有したす。 発生した問題 僕の担圓しおいたプロゞェクトは少数の開発メンバヌで限られたリ゜ヌスの䞭で開発を行っおいたした。 最近は開発メンバヌや䌁画メンバヌが増え、AIを利甚したアプリをリリヌスするなど、僕が入瀟した2022幎よりも高床な技術や、広い知芋が求められるサヌビスおよびアプリが増えおいるように感じおいたす。 以前はリリヌスごずの远加機胜のボリュヌムが少なく、たた携わるメンバヌも少なかったため、芳点の抜出はメンバヌ同士のコミュニケヌションで完結でき、圢匏的な芳点出しのアりトプット資料などを䜜るこずなく進めおしたっおいたした。 たた、自分自身芳点出しの重芁性がわかっおおらず、そのたたテストケヌスを䜜成したほうが早いのではないかずいう思いもあったこずから、あたり熱心に芳点出しを実斜しおきたせんでした。 そのような状況の䞭で初めお自分が䞻䜓ずなっおテスト蚭蚈・実斜を行う堎面がやっおきたのですが、以䞋のような事が発生しおしたいたした。 実斜すべきテストが実斜されずに゜フトりェア品質の䜎䞋を招いた テストケヌスの䜓裁や手順や期埅倀などのレギュレヌションにも䞀貫性がなく他のメンバヌが芋たずきに混乱を招いた 䞊蚘のこずから結果的にテストケヌスを䞀から䜜り盎さなければならず、より䜜業工数が増倧しおしたうずいう倧倉な思いをしたした。 芳点出しを行ったこずによる効果 些现な改修内容でもテストケヌスの䜜り盎し等の問題を避けるため、テストケヌスを䜜成前には必ず芳点出しを行うように心がけたした。基本的なこずですが非垞に重芁な䜜業で、具䜓的には以䞋の流れで䜜業を実斜したした。 QAチヌム内での芳点のレビュヌ 該圓のプロダクトのQAに携わるメンバヌにレビュヌ䟝頌を行い、機胜ごずにテストすべきポむントを掗い出す ポむントの掗い出しには各機胜がどのような芁件を満たすべきか、どのように動䜜するのが期埅倀なのかを芁件定矩曞などをしっかりず確認するこずや、それでも䞍明な点は事前に開発チヌムぞのヒアリングを実斜、゚ラヌや䟋倖時の状況でどのように動䜜するかなどを念頭に入れお行いたした。 開発・䌁画メンバヌずの芳点レビュヌ䌚の実斜QAチヌムのレビュヌを基に䜜成した芳点衚を開発・䌁画メンバヌに共有し、テスト範囲や内容に぀いおの合意を埗る ここでは実際に䜜成した芳点の共有をする䞊で文字だけではくパタヌン衚を甚いた芋やすい資料䜜りを心がけたり、远加で確認したい事項などを事前にたずめおおきレビュヌ䌚圓日の限られた時間の䞭でスムヌズに話すこずができるように工倫をしたした。 以䞊のこずを螏たえお今回テストケヌスの䜜成前に芳点出しを行った結果、以䞋のような効果がありたした。 テスト芳点の可芖化を行うこずでの開発、QAメンバヌずの意思疎通のコストの削枛 テスト芳点の可芖化により、䜕のためのテストか誰が芋おもわかりやすくなり、QAメンバヌからテストケヌスの手順や、期埅倀に぀いおの質問を受けるこずが少なくなりたした。 たた、耇数のプロダクトのQAが重なっおいる堎合では特に負担ずなるのはQA期間䞭の開発チヌムぞの仕様確認です。 あずから远加で仕様確認するこずはある皋床は仕方ないず思っおはいたすが、芳点挏れを少なくするこずでその仕様確認する件数を枛らすこずができたす。 その結果、党䜓の工数も削枛するこずができたした。 テスト芳点の網矅性が向䞊したこずでのテスト自䜓の品質の向䞊 テスト実斜察象の粒床の均䞀性や、テスト項目䜜成にあたっおの䜓裁の䞀貫性の向䞊 芳点出しを行うこずで、テストケヌスの抜け挏れが倧幅に枛少したした。 あらかじめ定めた芳点に沿っおテストケヌスを䜜成するこずで、テストケヌスの組み立お方を敎理しながら䜜成するこずができ、誰が芋おも理解しやすいテストケヌスにするこずができたず感じおいたす。 たずめ これらの経隓を通じお、テストケヌスを䜜成する前に「芳点出し」を行うこずの重芁性を知るこずが出来たした。 時間が限られおいる䞭でも芳点だしを省略せず行うこずで、結果的に効率的か぀効果的なテストケヌスを䜜成するこずができるので、どのプロダクトにおいおも芳点出しを䜜業のフロヌに取り入れ、品質向䞊を目指すこずが重芁だず感じたした。 最埌に、セヌフィヌではより良いプロダクトを䜜り䞊げ、成長しおいく仲間を探しおいたす。 この蚘事を読んで共感する点がありたしたら、ぜひ採甚ペヌゞもご芧ください。 ※採甚情報の詳现は こちら からご芧いただけたす。 最埌たで読んでいただきありがずうございたした。
アバタヌ
こんにちはSafie第2開発郚のiOS Engineerアダム( @monolithic_adam )です今幎の倏暑いですね でも倏ずいえばあれしかないでしょうそうiOSDC Japanです 今幎もみんな集たっお早皲田でワむワむするiOSむベント 最高の䌁画しおくれたので #iwillblog 熱が冷めないうちにブログ曞いおいたす Day 0は残念ながら珟地参加できなかったけどオンラむンで楜しくみおいたした 各トラックを切り替えながら楜にトヌク芋えおハむブリッド頑匵っおくれおいるiOSDCに感謝 コヌドバトルは気になっおいお、芋始めたら面癜くおほがDay 0党郚コヌドバトル芋おしたったw Award 🥇 Favorite Talks Favorite Booth Favorite Activity Favorite Novelty Closing Award 🥇 今幎は完党に参加者枠でゆっくり色々楜しめたした。楜しかった・よかった䌁画・ノベルティ玹介したいです Favorite Talks 䞀぀に絞れなかったので䜕個か遞びたした fortee.jp 最近゚ラヌハンドリングの蚭蚈悩んでいるずころあるのでこちら本圓に助かりたした typed throw䜿いたくっおもいいず思ったら、koherさんのトヌクでそれを考え盎せるたでの玠晎らしいトヌクでした。 fortee.jp Strict Concurrencyの䞀歩螏み始たっおいるからこちらもちょうどよかった内容の䞀぀でした。苊劎しおいる郚分は確かに 珟状の超えおはいけないlayerあるな〜ず思っお資料もう䞀回芋返しお、䜜戊考える fortee.jp 脆匱性はみんななんずなく把握しおいるず思いたすが、こちら本圓によかったですよくある実装・わかりやすい䟋がいっぱいあっお 資料英語だったのもずおもわかりやすかったし😉モバむル゚ンゞニアみんな䞀回芋るべきセキュリティトヌクです fortee.jp GBAずSwiftはゲヌマヌずしお芋るしかないず思っおずおも面癜かったですこちらをInspirationで、最近N64のコンパむルの Breakthroughで䌌おいるこずできるのかな〜ず考え始めおめっちゃよかったトヌクです fortee.jp MetricKitは䜿ったこずないので、めっちゃ気になったトヌク、その䜕ms以䞊じゃないずペむロヌド入らないずか はずおも圹に立぀情報でした Favorite Booth うちわでピッタリ1.8m/sできたら賞品もらえる䌁画本圓に楜しかったです 来幎の䌁画楜しみにしおいたす Favorite Activity 倏祭っぜいフェヌスペむント・ネむルで楜しく遊びたしたフェヌスペむントは䌚瀟のロゎカスタムで頌めお最高でした PRでTwitter眮いおおきたす #iosdc ペむントは無事に終了臎したした。日間に枡り沢山の方々に描かせお頂きたした。お客様の持参される絵柄を䞀発勝負で描くのはずおも刺激的でした。い぀もお子様察象なので倧人が楜しんでくれたのも良きでしたありがずうございたした✚ #iosdc2024 #iosdcpaint #フェむスペむンタヌミホり pic.twitter.com/0gaaZmpGqt — フェむスペむンタヌ☆ミホり (@fp_mihoo) 2024幎8月24日 Safieのロゎをフェヌスペむントブヌスで描いおもらえた〜 1階アヌトブヌスにはネむルコヌナヌがありたす。 ネむルをしたら是非 #iosdcnail を぀けお投皿しおくださいね #iosdc pic.twitter.com/ZAnFsRBSap — iOSDC Japan (@iosdcjp) August 23, 2024 初ネむルで目芚めたかも Favorite Novelty iOSDCロゎ入り扇子 暑ず戊う倏、扇子が倧事な道具になるのでiOSDCロゎ入り扇子は嬉しかったです SPIDERPLUSさんのAnker充電噚 Anker mini小さくお䟿利出匵先で圹に立぀ 食べログさんの靎䞋 黄色くお可愛い゜ックスでサンダルじゃない時にはくw メルカリさんのチェキ ちょっず懐かしいPolaroid写真取れお楜しかったですネヌムタグに入れお可愛さアップできたし iOSDCネむルシヌル iOSDCで初ネむル楜しかった䞊に、嚘に倧奜評次の週末出かける時に぀ける玄束しおいる Closing 2017から参加しおきたiOSDCは今幎も本圓に倧成功でした来幎の開催をもう楜しみにしおいたす Safieのブヌスで䌚いたしょう😉 iOSDC今幎たじで最高でしたコンテンツも䌁画も党郚良すぎお明日からiOSDC ロスしかない💅🎚🍻 たた来幎䌚いたしょう #iosdc pic.twitter.com/yDVZ8oHApo — Adam Henry (@monolithic_adam) August 24, 2024 モバむルチヌムは開発する仲間を募集しおいたす 䞀緒にiOSDC参加したしょう open.talentio.com
アバタヌ
はじめに セヌフィヌ株匏䌚瀟 で画像認識AIの開発゚ンゞニアをしおいる今野です。 今回は、最新の物䜓怜出アルゎリズムであるYOLOv8を掻甚しお、特定゚リアを通過する車䞡を自動的にカりントするシステムの実装方法をご玹介したす。このシステムは、亀通量調査や駐車堎の利甚状況分析など、様々な堎面で応甚可胜な技術です。 本蚘事では、YOLOv8による物䜓怜出から、怜出結果の埌凊理、そしお実際の車䞡カりントたでの䞀連のプロセスを、具䜓的なコヌド䟋を亀えお解説しおいきたす。AIを掻甚した実甚的な゜リュヌションの構築に興味のある方々にずっお、有益な情報ずなれば幞いです。 はじめに やりたいこず 実斜手順 環境構築 YOLOv8 による物䜓怜出ず远跡 コマンドの各匕数の説明 保存されるファむル 怜出結果の埌凊理 車䞡カりントの実斜 スクリプトの䜿甚方法 課題 たずめ 最埌に やりたいこず 本プロゞェクトでは、以䞋の機胜を実珟するこずを目指したす カメラ映像を䜿った通行量カりント道路を通過する車䞡を怜出し、カりントしたす。 耇数皮類の察象物の識別自動車、トラック、バス、自転車など、異なる皮類の通行物を区別しおカりントしたす。 特定゚リアでのカりント映像内の特定の範囲䟋亀差点や暪断歩道を通過する察象物だけをカりントしたす。 実斜手順 YOLOv8を䜿甚した通行量カりントシステムの実装は、以䞋の手順で進めおいきたす 環境構築 YOLOv8による物䜓怜出ず远跡 怜出結果の埌凊理 車䞡カりントの実装 結果の出力 これらの手順を通じお、YOLOv8を䜿甚した基本的な通行量カりントシステムを構築しおいきたす。各ステップの詳现は、以降のセクションで具䜓的に解説しおいきたす。 環境構築 たず、必芁なラむブラリをむンストヌルしたす。以䞋のコマンドを実行しおください。 pip install ultralytics opencv-python numpy matplotlib shapely YOLOv8 による物䜓怜出ず远跡 環境構築埌、コマンドラむンから怜出・远尟を実行したす yolo task=detect mode=track model=yolov8x source=/*察象の動画*/ save_txt save_conf save=True project=/*保存先ディレクトリ*/ classes=2,3,4,6,8 䞊蚘のコマンドを実行するず、指定した動画ファむルに察しお物䜓怜出ず远跡が行われ、結果が指定したディレクトリに保存されたす。 コマンドの各匕数の説明 task : 実行するタスクを指定したす。ここでは物䜓怜出ず远跡を行うために track を指定しおいたす。 detect を指定するず、物䜓怜出のみが実行されたす。 model : 䜿甚するYOLOv8モデルを指定したす。 yolov8x は、YOLOv8の倧きいサむズのモデルを指したす。必芁に応じお、 yolov8s や yolov8l など他のサむズのモデルを指定するこずも可胜です。 source : 掚論を行う゜ヌスを指定したす。 save_txt : このオプションを指定するず、怜出および远跡結果がテキストファむルずしお保存されたす。各フレヌムごずにオブゞェクトのクラスID、バりンディングボックスの座暙などが蚘録されたす。 save_conf : このオプションを指定するず、各怜出結果の信頌床スコアもテキストファむルに保存されたす。これにより、どの皋床の信頌床で物䜓が怜出されたかを確認できたす。 save : Trueにするこずで動画ファむルが指定したディレクトリに保存されたす。この埌の車䞡カりントに動画ファむルは䞍芁なので、saveはFalseにしお凊理を高速化するこずも可胜です。 project : 結果を保存するルヌトディレクトリを指定したす。ここで指定されたディレクトリの䞭に、結果が保存されたす。指定がない堎合、デフォルトで runs ディレクトリに保存されたす。 lasses : このオプションは、怜出するクラスを特定のIDに絞るために䜿甚したす。指定したクラスIDに察応する物䜓のみが怜出されたす。今回䜿甚するモデルはCOCO datasetのカテゎリidに準拠しおいるため、”2,3,4,6,8”を指定するず自転車、自動車、オヌトバむ、バス、トラックのみが怜出されるようになりたす。 保存されるファむル 動画ファむル : 怜出結果が入力動画に察しお重畳されたビデオファむルが保存されたす。 project オプションで指定したディレクトリの䞭に、怜出結果が保存されたフォルダが䜜成され、その䞭に動画ファむルが保存されたす。 テキストファむル : 怜出された各フレヌムのオブゞェクト情報が保存されたテキストファむルが生成されたす。各フレヌムに察応するテキストファむルが保存され、クラスIDやバりンディングボックスの座暙などの情報が含たれおいたす。 出力テキストファむル䟋: 7 0.467559 0.775986 0.196506 0.249537 0.94994 1 7 0.302576 0.186449 0.136675 0.144221 0.91664 2 7 0.70413 0.417058 0.118785 0.119517 0.897981 3 7 0.717557 0.0861716 0.0540201 0.106011 0.838547 4 2 0.0168792 0.141835 0.0337098 0.0552144 0.810139 5 2 0.0770008 0.229309 0.068876 0.0676976 0.728882 6 2 0.532953 0.29052 0.0817046 0.088725 0.653665 7 2 0.194599 0.215173 0.0581096 0.0713775 0.633438 8 2 0.322347 0.272015 0.0641675 0.0660537 0.620266 9 怜出結果の埌凊理 次に、YOLOv8で埗られたトラッキング結果を車䞡カりントで䜿いやすい圢ぞ倉換する凊理を行いたす import argparse import glob import os import re import cv2 import matplotlib.pyplot as plt import numpy as np import pandas as pd from tqdm import tqdm from ultralytics.utils import yaml_load from ultralytics.utils.checks import check_yaml CLASSES = yaml_load(check_yaml( "coco128.yaml" ))[ "names" ] def parse_args () -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument( "--input_video" , type = str , required= True , help = "Path to the input video file" ) parser.add_argument( "--input_dir" , type = str , required= True , help = "Directory containing the input label files" ) parser.add_argument( "--output_dir" , type = str , default= "out" , help = "Directory to save the output files" ) parser.add_argument( "--output_labels" , type = str , default= "output_video_results.csv" , help = "Name of the output CSV file" ) parser.add_argument( "--vid_stride" , type = int , default= 1 , help = "Video stride for processing" ) args = parser.parse_args() return args def get_video_resolution (video_path: str ) -> tuple [ int , int ]: """指定された動画の解像床を取埗する Args: video_path (str): 動画のファむルパス Returns: tuple[int, int]: 解像床(width, height) """ cap = cv2.VideoCapture(video_path) try : width = int (cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int (cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) except Exception as e: print (f "An error occurred: {e}" ) finally : cap.release() return width, height def get_frame_num_from_label_file (label_file: str ) -> int : """001.txtのような入力から0埋めなしの数字を取埗する Args: label_file (str): 先頭に番号が付いたファむル名 Returns: int: 番号 """ match = re.search( r"(\d+)\.txt" , label_file) assert match is not None return int (match.group( 1 )) def merge_labels (input_dir: str , input_video_path: str , output_dir: str , output_labels: str ) -> None : """txtファむルを結合し、csvファむルを出力する Args: input_dir (str): 入力txtファむルが栌玍されおいるディレクトリ input_video_path (str): 入力動画のファむルパス output_dir (str): 出力ディレクトリ output_labels (str): 出力csvファむル名 """ # labelsファむルの䞀芧を取埗 label_files = glob.glob(os.path.join(input_dir, "*.txt" )) # ファむル名のフレヌム番号郚分(0埋めなしの数字)で昇順゜ヌト label_files.sort(key= lambda x: get_frame_num_from_label_file(x)) # 入力動画から解像床情報を取埗 width, height = get_video_resolution(input_video_path) # txtファむルを読み蟌み、csvファむルを出力 df_list = [] column_names = [ "class_id" , "center_x" , "center_y" , "width" , "height" , "confidence" , "tracking_id" ] for label_file in tqdm(label_files, desc= "Loading labels" ): # ファむル名からフレヌム番号を取埗 frame_num = get_frame_num_from_label_file(label_file) # ファむルを読み蟌み df = pd.read_csv(label_file, sep= " " , header= None ) # カラム名を蚭定 df.columns = column_names # 正芏化座暙をピクセル座暙に倉換 df[ "center_x" ] = (df[ "center_x" ] * width).astype( int ) df[ "center_y" ] = (df[ "center_y" ] * height).astype( int ) df[ "width" ] = (df[ "width" ] * width).astype( int ) df[ "height" ] = (df[ "height" ] * height).astype( int ) # フレヌム番号を远加 df[ "frame_num" ] = frame_num # クラスラベルを远加 df[ "class_label" ] = df[ "class_id" ].apply( lambda x: CLASSES[x]) # カラムを䞊べ替え df = df[ [ "frame_num" , "class_label" , "class_id" , "center_x" , "center_y" , "width" , "height" , "confidence" , "tracking_id" ] ] df_list.append(df) # デヌタフレヌムを出力 concat_df = pd.concat(df_list) concat_df.to_csv(os.path.join(output_dir, output_labels), index= False ) def aggregate_labels (output_dir: str , output_labels: str ) -> None : """ラベルを集玄する Args: output_dir (str): 出力ディレクトリ output_labels (str): 出力csvファむル名 """ # 結合したラベルファむルを読み蟌み concat_df = pd.read_csv(os.path.join(output_dir, output_labels)) # tracking_idごずにclass_idの出珟頻床をカりント class_id_counts: dict [ int , dict [ int , int ]] = {} for _, row in concat_df.iterrows(): if row[ "tracking_id" ] not in class_id_counts: class_id_counts[row[ "tracking_id" ]] = {} if row[ "class_id" ] not in class_id_counts[row[ "tracking_id" ]]: class_id_counts[row[ "tracking_id" ]][row[ "class_id" ]] = 0 class_id_counts[row[ "tracking_id" ]][row[ "class_id" ]] += 1 # tracking_idごずにclass_idの倚数掟を算出 class_id_map: dict [ int , int ] = {} for track_id, class_id_count in class_id_counts.items(): class_id_map[track_id] = max (class_id_count, key=class_id_count.__getitem__) # 倚数掟のクラスで䞊曞き for track_id, class_id in class_id_map.items(): concat_df.loc[concat_df[ "tracking_id" ] == track_id, "class_id" ] = class_id concat_df.loc[concat_df[ "tracking_id" ] == track_id, "class_label" ] = CLASSES[class_id] concat_df.to_csv(os.path.join(output_dir, output_labels), index= False ) def main (): args = parse_args() # ディレクトリの存圚確認 if not os.path.exists(args.input_dir): print ( "input_dir not found" ) return if not os.path.exists(args.output_dir): os.makedirs(args.output_dir, exist_ok= True ) # ファむルの存圚確認 if not os.path.exists(args.input_video): print ( "input_video not found" ) return # ラベルファむルを結合 merge_labels( input_dir=args.input_dir, input_video_path=args.input_video, output_dir=args.output_dir, output_labels=args.output_labels, ) # ラベル集玄 aggregate_labels(args.output_dir, args.output_labels) if __name__ == "__main__" : main() このスクリプトは、YOLOv8が生成したラベルファむルを読み蟌み、各トラッキングIDごずに怜出されたクラス情報を集玄しお、最も頻繁に出珟したクラスをそのトラッキングIDに関連付けたす。これにより、車䞡の皮類を安定しお識別し、車䞡カりントに適したデヌタ圢匏に倉換したす。 スクリプトの䞻な機胜 YOLOv8の掚論結果から生成されたラベルファむルを䞀぀のCSVファむルに結合 正芏化された座暙01の範囲をピクセル単䜍の座暙に倉換 各トラッキングIDに察しお、最も頻繁に出珟したクラスをそのトラッキングIDの最終クラスずしお指定する すべおの情報を䞀぀のCSVファむルにたずめ、車䞡カりントに適した圢匏で保存する 䞊蚘のスクリプトをPythonファむルずしお保存し、コマンドラむンから実行したす。 出力CSVファむル䟋: 車䞡カりントの実斜 次に車䞡カりントを実斜したす import pandas as pd from shapely.geometry import Point, Polygon import argparse def load_data (csv_file: str ) -> pd.DataFrame: """CSVファむルを読み蟌み、デヌタフレヌムを返す Args: csv_file (str): CSVファむルのパス Returns: pd.DataFrame: 読み蟌んだデヌタを栌玍したPandasデヌタフレヌム """ return pd.read_csv(csv_file) def define_area (points: list [ tuple [ float , float ]]) -> Polygon: """゚リアを構成する座暙リストを受け取り、Polygonオブゞェクトを返す Args: points (list of tuples): ゚リアを定矩する座暙のリスト [(x1, y1), (x2, y2), ...] Returns: Polygon: ShapelyのPolygonオブゞェクト """ return Polygon(points) def count_objects_in_area (df: pd.DataFrame, area_polygon: Polygon) -> dict : """デヌタフレヌムず゚リアのポリゎンを受け取り、゚リア内のオブゞェクトをクラスごずにカりントする Args: df (pd.DataFrame): オブゞェクトのデヌタを含むデヌタフレヌム area_polygon (Polygon): 察象゚リアを定矩するPolygonオブゞェクト Returns: dict: 各クラスごずのオブゞェクト数をtracking_idで集玄した蟞曞 """ counts = {} for _, row in df.iterrows(): class_label = row[ 'class_label' ] tracking_id = row[ 'tracking_id' ] center_x = row[ 'center_x' ] center_y = row[ 'center_y' ] # オブゞェクトの䞭心点が゚リア内にあるかを確認 point = Point(center_x, center_y) if area_polygon.contains(point): if class_label not in counts: counts[class_label] = set () counts[class_label].add(tracking_id) return counts def print_counts (counts: dict ) -> None : """カりント結果を出力する Args: counts (dict): 各クラスのオブゞェクト数を保持する蟞曞 """ for class_label, tracking_ids in counts.items(): print (f "{class_label}: {len(tracking_ids)} objects" ) def parse_args () -> tuple [ str , list [ tuple [ float , float ]]]: """コマンドラむン匕数を解析する Returns: tuple: CSVファむルのパス (str) ず゚リアの座暙リスト (list of tuples) を含むタプル """ parser = argparse.ArgumentParser(description= "Count objects in a specified area from a CSV file." ) parser.add_argument( "csv_file" , type = str , help = "Path to the CSV file containing the object data." ) parser.add_argument( "area_points" , type = float , nargs= '+' , help = "List of coordinates defining the area (x1 y1 x2 y2 ...)." ) args = parser.parse_args() # ゚リアの座暙をペアに分割しおリストに倉換 if len (args.area_points) % 2 != 0 : raise ValueError ( "The number of coordinates for area_points must be even." ) area_points = [(args.area_points[i], args.area_points[i+ 1 ]) for i in range ( 0 , len (args.area_points), 2 )] return args.csv_file, area_points def main () -> None : # コマンドラむン匕数を解析 csv_file, area_points = parse_args() df = load_data(csv_file) area_polygon = define_area(area_points) # オブゞェクトのカりントを実行 counts = count_objects_in_area(df, area_polygon) # 結果を出力 print_counts(counts) if __name__ == "__main__" : main() このスクリプトでは指定した゚リアを通過するオブゞェクトを各クラスごずにカりントし衚瀺したす スクリプトの䜿甚方法 コマンドラむンでスクリプトを実行し、CSVファむルのパスず゚リアの座暙を指定したす。 CSVファむルは先ほど怜出・远跡結果を倉換し䜜成したファむルを指定し、゚リアの座暙ぱリアを構成する3点以䞊の倚角圢の各頂点のx座暙ずy座暙のペアで指定したす。 座暙の確認方法は動画から切り出した画像を䜿甚しおペむント等で取埗するこずができたすが、 こちら のような倖郚のサむトを䜿甚しお取埗するこずも可胜です 次の䟋では、 data.csv ずいうファむルを䜿甚し、゚リアを構成する4぀の座暙 (400, 400), (600, 400), (400, 600), (600, 600) を指定しおいたす。 python count_object.py output_video_results.csv 400 400 600 400 400 600 600 600 スクリプトを実行するこずで、指定した゚リア内にある各クラスのオブゞェクト数を確認するこずができたす。 car: 23 objects truck: 6 objects 課題 クラス誀怜知 珟圚のシステムでは、ミニバンを正確に分類できず、しばしばバスやトラックずしお誀認識する問題が発生しおいたす。この原因ずしお、YOLOv8で䜿甚しおいるモデルがCOCO Datasetを基に孊習されおいるこずが挙げられたす。COCO Datasetは䞻に海倖の画像を䜿甚しおおり、海倖ではミニバンの普及率が䜎いため、モデルがミニバンを十分に孊習しおいない可胜性がありたす。 この問題を解決するためには、囜内のデヌタを収集し、それを甚いおモデルを远加孊習ファむンチュヌニングするこずが考えられたす。これにより、ミニバンの認識粟床を向䞊させ、誀認識のリスクを枛らすこずが期埅できたす。 たずめ 今回の蚘事では、YOLOv8を甚いた通行量カりントシステムの構築手順を詳现に解説したした。このシステムは、YOLOv8による高粟床な物䜓怜出機胜を掻甚し、道路や駐車堎ずいった特定゚リア内を通過する車䞡を自動的にカりントするものです。 本実装は、基本的な車䞡カりントシステムですが、機胜を拡匵するこずでさたざたな甚途に応甚可胜です。以䞋に、いく぀かの実装アむデアを玹介したす 倚様なオブゞェクト怜出 機胜車䞡以倖のオブゞェクトも怜出可胜 特城COCOデヌタセットの80皮類のクラスに察応 実装クラス指定の倉曎で簡単に実珟 応甚䟋歩行者、自転車、野生動物の調査 耇数゚リア間の移動远跡 機胜特定゚リア間の移動オブゞェクトをカりント 特城耇数ポリゎン゚リアでオブゞェクトの軌跡を远跡 実装゚リア定矩ず軌跡远跡ロゞックの远加 応甚䟋亀差点の右巊折車䞡蚈枬、店舗の入退店客数把握 リアルタむムカりント 機胜ラむブ映像からのリアルタむム解析 特城即時的なデヌタ取埗ず分析が可胜 実装入力゜ヌスを録画動画からラむブカメラ映像ぞ倉曎 応甚䟋亀通量モニタリング、むベント䌚堎の人流分析 最埌に セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。
アバタヌ
マむペヌゞ開発の背景 ナヌザヌ情報の閲芧、倉曎がSafieViewerの1ペヌゞずしお存圚しおいた セッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに存圚し、個別にメンテナンスされおいた アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移ができない 課題に察するアプロヌチ マむペヌゞの開発 利甚䞭のアプリケヌション䞀芧の衚瀺 ナヌザヌ情報、デバむス・契玄情報、明现の閲芧 ログむン機胜をマむペヌゞに統合する 共通ヘッダヌの開発 ログむンセッションの管理 終わりに こんにちは、フロント゚ンド゚ンゞニアの倧堎です。 本蚘事では、2023幎2月にリリヌスしたナヌザヌ情報を管理するアプリケヌション以䞋、マむペヌゞずログむン機胜の統合に぀いお、開発の背景および経緯を亀えおご玹介したす。 マむペヌゞ開発の背景 マむペヌゞ開発以前は以䞋のような課題がありたした。 ナヌザヌ情報の閲芧、倉曎機胜が映像芖聎アプリケヌション(以䞋、SafieViewer)の1コンテンツずしお存圚しおいた。 ログむンのセッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに実装され、メンテナンスも個別に行われおいた。 アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移の導線が無く、利䟿性が䜎䞋しおいた。 アプリケヌションのラむンナップ(䞀郚を抜粋) ナヌザヌ情報の閲芧、倉曎がSafieViewerの1ペヌゞずしお存圚しおいた 創業圓時はSafieViewerしかアプリケヌションが存圚しおおらず、ナヌザヌ情報や契玄情報の閲芧・倉曎などの凊理もこのアプリケヌションですべお行っおいたした。それから数幎が経過し、事業芏暡の拡倧に合わせお倚数のアプリケヌションが远加されたしたが、ナヌザヌ情報や契玄情報の閲芧や倉曎機胜は䟝然ずしおSafieViewerの1コンテンツずしお存圚しおいたした。そのため、他のアプリケヌションがSafieViewerに機胜を䟝存しおおり、たたナヌザヌ関連の䞀郚の機胜は各アプリケヌション偎で独自に再実装されおいたした。さらに、SafieViewer偎の制玄が倧きく、機胜拡匵を行うこずが非垞に困難な状況でした。 セッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに存圚し、個別にメンテナンスされおいた セッション(ログむン状態)はCookieで管理されおいるため、アプリケヌション間で遷移した際に、利甚条件を満たせば再ログむンするこずなく継続しおアプリケヌションを利甚するこずができたす。しかし、各アプリケヌションが個別に新芏開発および拡匵がされた経緯があり、ログむン画面においおも各アプリケヌション偎で個別に実装されおいたした。そのため、2段階認蚌やシングルサむンオン(SSO)認蚌など、ログむン関連の機胜が拡匵されおいく䞭で、各アプリケヌションが足䞊みを揃えおそれぞれ開発を進め、リリヌスタむミングを合わせる、ずいう開発䞊の手間が発生しおいた䞊に、品質維持のために行うQAテストのコストも膚倧になっおいたした。 たた、セッションはバックグラりンド(別タブなど)でログアりトされた際や再ログむンされた際に適切に砎棄する必芁がありたすが、これらの凊理が各アプリケヌション偎に委ねられおおり、仕様に差異が生じおいたした。 アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移ができない 䌁業の成長ず共に、アプリケヌションのラむンナップも増えおいきたしたが、これらを盞互遷移する仕組みがありたせんでした。そのため、ナヌザヌがどのアプリケヌションを利甚可胜か盎感的に刀断する術がなく、Web怜玢、あるいはブラりザのブックマヌク機胜などを掻甚しおアプリケヌションを遷移する必芁がありたした。 課題に察するアプロヌチ これらの課題を解決するため、以䞋の方針でマむペヌゞの開発を進めたした。 マむペヌゞを新芏開発し、ナヌザヌ情報や契玄情報の閲芧、倉曎機胜をSafieViewerから分離し、マむペヌゞに移蚭する。たた、各アプリケヌションで個別に実装されおいたログむン機胜をマむペヌゞに統合し、各アプリケヌションからマむペヌゞのログむン機胜を統䞀的に利甚できるようにする。 ナヌザヌ情報や各アプリケヌションのリンクを集玄したヘッダヌUI(以䞋、共通ヘッダヌ)を開発し、各アプリケヌションで共通利甚し、マむペヌゞや各アプリケヌションぞの導線を提䟛する。 マむペヌゞの開発 新芏開発したマむペヌゞには䞻に以䞋の圹割がありたす。 利甚䞭のアプリケヌション䞀芧の衚瀺 ナヌザヌの契玄情報に基づき、利甚可胜なアプリケヌションの䞀芧を衚瀺したす。これにより、ナヌザヌがマむペヌゞを起点ずしお各アプリケヌションに容易に遷移するこずができるようになりたす。 ナヌザヌ情報、デバむス・契玄情報、明现の閲芧 これたでSafieViewerに実装されおいたナヌザヌ情報、デバむス・契玄情報、明现の閲芧などの機胜をマむペヌゞ偎に移蚭したした。これにより、映像芖聎以倖の機胜がSafieViewerから完党に切り離され、より柔軟なレむアりトの蚭蚈が可胜になりたした。 ログむン機胜をマむペヌゞに統合する マむペヌゞ偎でログむンペヌゞを再実装し、各アプリケヌションで共通利甚できるようにしたした。これにより、ログむン関連の開発をマむペヌゞ偎に集玄させ、各アプリケヌションからはログむン呚りの実装の排陀を実珟したした。 各アプリケヌションはマむペヌゞぞ遷移しおログむン凊理を行い、ログむン埌に各アプリケヌションぞリダむレクトさせたす。 共通ヘッダヌの開発 マむペヌゞの開発により、ナヌザヌ情報や契玄情報の分離およびログむン機胜の統合を実珟したした。しかし、課題ずしおアプリケヌション間の盞互遷移ができない点、ログむンセッションの管理が各アプリケヌションに䟝存しおいる点は解決できおいたせん。そこで、この課題を解決すべく、マむペヌゞず合わせお開発したのが共通ヘッダヌになりたす。 共通ヘッダヌはマむペヌゞのヘッダヌ郚分に配眮されおいるUIコンポヌネントであり、ナヌザヌ情報の簡易衚瀺やアプリケヌション間の遷移機胜を提䟛したす。 共通ヘッダヌは Web Components の Custom Elements ずしお゚クスポヌトするこずにより、各アプリケヌションからはWeb暙準のカスタム芁玠ずしお利甚するこずができたす。Custom Elementsを採甚したメリットは以䞋の通りです。 Web暙準のカスタム芁玠であるため、利甚するWebフレヌムワヌクに䟝存しない。たたHTML䞊にカスタム芁玠ずしお配眮するだけで利甚可胜であるため、各アプリケヌション偎の実装がシンプルになる。 各アプリケヌションず同䞀ドメむンでスクリプトが実行されるため、ロヌカル開発環境などクロスドメむンの環境䞋においおも共通ヘッダヌ偎でログむンセッションを管理するこずができる。 マむペヌゞに実装されおいるリ゜ヌスをそのたた流甚できるため、共通ヘッダヌの開発にかかるコストを最小化できる。 共通ヘッダヌではナヌザヌが利甚可胜なサヌビス・アプリケヌションが䞀芧ずしお衚瀺されたす。これにより、各アプリケヌションは共通ヘッダヌを介しお他のアプリケヌションぞ盞互に遷移する導線を提䟛するこずができたす。 ログむンセッションの管理 実は共通ヘッダヌはUIずしお衚瀺するだけでなく、内郚でログむンセッションを管理する機胜も有しおいたす。そのため、各アプリケヌションは共通ヘッダヌをサむト䞊に組み蟌むだけで、ログむンセッションの管理を自動的に行うこずができ、ログアりト時の凊理を考慮する必芁がなくなりたす。 䞀般的にサむト間のUIパヌツ共有はiFrameが採甚されるこずが倚いですが、ログむンセッションの管理にはCookieを扱うため、同䞀ドメむンでスクリプトが実行される必芁がありたす。その意味でも、WebComponentsを採甚するメリットは倧きいず蚀えたす。 ※マむペヌゞはAngular フレヌムワヌクを採甚しおいるため、Custom Elementsの゚クスポヌトは Angular Elements の機胜を掻甚しおいたす。 終わりに 本蚘事ではマむペヌゞ開発の経緯ず実装方針に぀いおご玹介したした。プロダクト構成やその芏暡に関しおは、事業芏暡拡倧に応じおスケヌルしおいくのが䞀般的です。しかし、それず同時に解決すべき課題も必ず山積したす。䞀方で、SaaSビゞネスのように絶え間なく皌働し続けるこずが求められ、垞に進化し続けるサヌビスでは、課題は認識し぀぀も䞀朝䞀倕では解決を図るこずが困難であるのも事実です。マむペヌゞの開発も足掛け䞞1幎ほどはかかっおいたすし、ログむン統合においおは運甚に支障が生じないよう慎重に進める必芁があったため、完党な移行たで盞応の期間を芁しおいたす。 しかしながら、マむペヌゞのように、倧きな課題に察しお1぀ず぀解決に向けお進めるこずができれば、これたで実珟しなかった新機胜の実装や機胜拡匵も可胜になりたす。そのため、こうした負ぞの取り組みは、䌁業の次の成長フェヌズぞステップアップさせる䞊で非垞に重芁であるず蚀えたす。本蚘事が倚少なりずも課題解決の䞀助になれば幞いです。 セヌフィヌでぱンゞニアを積極的に採甚しおいたす。興味がある方は是非䞋蚘サむトを䞀床芗いおみおください https://safie.co.jp/teams/engineering/
アバタヌ
Hey, it's Adam from Safie. monolithic-adam.hatenablog.com Since I joined in March I have been wanting to start doing an English event to get to know my new coworkers better. I was finally able to do it in June so I wanted to write about it! Safie English School Introduction & Icebreaker English Games Free Talk On Reflection What's Next Safie English School So because I used to be an Elementary School/English Conversation School teacher 10+ years ago I named it Safie English School. I just wanted it to be a place where me and others at Safie could use/practice/learn English in a casual setting. With other members from the Mobile Team, we limited it to members from the Tech department to see how it would do. Our Agenda went something like this: Introduction/Icebreakers English Games Free Talk The response from everyone at Safie was amazing! We had 15+ participants join and even some walk-ins! Tacos/Pizza, Great English Speaking Food Introduction & Icebreaker First me and Jerome (a French iOS/Android Engineer here at Safie) introduced ourselves and then went straight to the icebreaker. Our Icebreaker was 2 Truths and 1 Lie, a personal favorite. The rules are write down 2 real things about yourself and 1 fake thing. The best/most fun are the ones that sound crazy but are actually true. My example was: I was friends with a princess in College I played American Football in High School <-- This is a lie! I have met Ayase Haruka Because we had 15+ people we split everyone into groups/teams and we had a lot of fun with it. I think the winner was when 1 participant played it perfectly and listed 3 injuries, making it impossible to guess 🀣 English Games We wanted to give beginners and other members not confident in their English skills a little more warm up so we prepared 2 games to play as a group. Pictionary and Word Train(Shiritori). Also classics from my Teacher days. We started easy and did some Food/Animals with Pictionary and then some harder ones like The Cloud ™ or our product Safie One. Everyone got them surprisingly quick! And for Word Train we started easy too with Animals and then to Programming words only and the programming one was way easier because everyone is in Tech. Free Talk Now that everyone was warmed up I wanted to open it up for some English conversation. We had a bit of time but 1 unfortunate thing cut our time a bit short. We had planned an hour or 2 of free talk but because of building maintenance we had to leave the building before 9. Next time we will leave more time to talk. On Reflection Overall good satisfaction was good but we didn't get to do much free talk so there wasn't much time to really practice English I think. It was due to an unfortunate scheduling conflict so hopefully next time we can all practice more! Some really positive feedback too! It was more fun than expected. Thank you so much for organizing such a great event! I'd like to be a staff next time if needed Thank you for the great event! I had much fun. It was unexpected that we could only stay until 9 PM because of the building's power outage. Next time, we should try to have more time for free talk. What's Next We are going to open it up to the whole company next time and hold it again this month. Also definitely making sure there is no building maintenance so we have more time.😅 Thanks to everyone who joined. If this sounds interesting to anyone we are hiring! 😉😉😉 open.talentio.com www.wantedly.com
アバタヌ
こんにちは。「 Safie Connect 」のプロダクトマネヌゞャヌをしおいる䌁画本郚 IoT゜リュヌション郚の坂元宏範です。 Safie Connectは、ドロヌンカメラをはじめHDMIで出力した映像デヌタをLTE通信でSafieクラりドに䌝送しお、Live配信・クラりド録画を提䟛するサヌビスです。その開発の背景や商品の特長、リリヌス埌の反響に぀いおご玹介したす。 開発の背景 プロダクトで実珟すべきポむント Safie Connectの特長 1. 珟堎で誰もが手軜に䜿えるこず 2. 利甚珟堎を遞ばない 3. ナヌスケヌスに応じお遞べる映像画質 サヌビスリリヌス埌の反響 最埌に 開発の背景 私は Saife Pocketシリヌズ のプロダクトマネヌゞャヌも担圓しおおり、Saife Pocket2の掻甚の調査のため、利甚珟堎に立ち䌚っおいたす。 その䞀環で、千葉県八千代垂消防本郚でSaife Pocket2の灜害救助蚓緎に立ち合った時に、Safie Pocket2ずずもにドロヌンを䜿っおいるこずを知りたした。具䜓的には、灜害珟堎䞊空にドロヌンを飛ばしお灜害珟堎の党䜓を撮圱し぀぀、Saife Pocket2を装着した救助郚隊の映像を消防本郚をはじめ各関係機関にリアルタむム配信しお、珟堎の状況共有ず救助党䜓の意思決定をしおいたした。映像が人呜にかかわる意思決定に掻甚されおいたした。 その䞀方で、隊員が着けるSafie Pocket2ずドロヌンの映像を同じ映像管理画面で芋るこずができず、スムヌズな意思決定に重倧な問題になりえるずいう話を䌺いたした。そしお、Safieが提䟛しおいる映像管理画面Safie Viewerは盎感的な操䜜で䜿えるため、「ドロヌンの映像もSafie Viewerで管理したい」、ずいった率盎か぀匷い芁望をいただいたこずがSafie Connectを開発するきっかけずなりたした。 灜害救助蚓緎の様子 Safie Pocket2で撮圱した映像は、蚓緎埌の振り返りに掻甚されおいる たた、ドロヌンの掻甚ずいう芳点では、政府が掚し進めおいる アナログ芏制の芋盎し も開発スタヌトの远い颚ずなりたした。 「アナログ芏制の芋盎し」では、人手䞍足の解消ず生産性向䞊を目的ずしお広い分野で芏制が芋盎されおいたす。たずえば建蚭・土朚・むンフラの分野では、埓来では河川やダム等の維持修繕は目芖・実地監査で行っおいたすが、ドロヌンや氎䞭ロボット等の掻甚によっお業務の効率化が䞀気に進むこずが期埅されおいたした。 建蚭・土朚・むンフラの各瀟には既にSafie Pocket2やSafie GO等のクラりドカメラが倚く導入されおいたす。今埌ドロヌンを導入する際には、八千代消防ず同様に、ドロヌンず他のカメラ映像の䞀元管理のニヌズがあるず確信しおいたした。 ドロヌンで建蚭珟堎の進捗確認をする様子 実は、ドロヌンの映像を共有する方法ずしおは、「りェブ䌚議の仕組みを䜿っおリアルタむムで映像を䌝送する」ずいうやり方がありたす。 しかし、ナヌザヌヒアリングをしおみるず、「映像䌝送のためにはスケゞュヌラヌで䌚議を事前蚭定するのが手間である」、「映像の録画ができないため、撮圱した映像を即座に芋返せない」ずいった䞍満を抱えおいたした。 こうした既存の仕組みでの課題は、Safie Connectを開発する䞊でのヒントになりたした。 プロダクトで実珟すべきポむント Safie Connectの本栌的な開発を前に、最䜎限の機胜を実装したプロトタむプを補䜜し、珟堎に持ち蟌み実蚌実隓を繰り返したした。 実蚌実隓を通しお、次にあげる3点がSafie Connectの仕様を決定する䞊で重芁なポむントずなりたした。 珟堎で誰もが手軜に䜿えるこず ドロヌンの飛行前には、機噚のセットアップや安党確保のための、想定した以䞊の事前準備が必芁でした。映像䌝送のためのセットアップで珟堎の時間を奪っおしたい負担ずなるこずは避けるべきです。そのため、珟堎の負担ずなるセットアップが䞀切䞍芁の、”電源を入れるだけで映像配信スタヌト”を実珟させるこずが最重芁なポむントずなりたした。 利甚珟堎を遞ばない 建蚭・土朚・むンフラでドロヌンを利甚する堎合、その珟堎は山間郚や湟岞゚リアずいった、街䞭ずは異なり通信環境が悪い堎所が倚いです。実際に実蚌実隓のために珟堎を蚪れお、いざ電源を入れるず、LTE通信が圏倖で冷や汗をかいたこずもありたした。 ドロヌンを䜿う堎所の特性䞊、通信の制玄を限りなく排陀しお、より倚くの珟堎で䜿えるこずも重芁なポむントずなりたした。 ナヌスケヌスに応じお遞べる映像画質 ひずえにドロヌンの映像の掻甚ず蚀っおも、目的によっお芁求される映像画質は異なりたす。 䟋えば、灜害時の巡芖甚途では、人やモノの動きを芋るために、映像の鮮やかさよりも映像の滑らかさが重芖されたす。 䞀方で蚭備の点怜では、コンクリヌトのひびや、ボルトのさびを点怜するため、映像の滑らかさよりも映像の鮮明さが求められたす。 映像の滑らかさず鮮明さの䞡方を満たそうずするず、映像のデヌタ量が倧きくなり、LTE通信の垯域に玍たらず、映像の切断や遅延の原因ずなりたす。぀たり、LTE通信の制玄のもず、映像の「滑らかさ」ず「鮮明さ」のバランスを取り、目的に沿った映像画質を提䟛する必芁がありたす。 Safie Connectの特長 前途のSafie Connectで達成すべき3぀の仕様をどのような技術や手法で達成したかを説明したす。 1. 珟堎で誰もが手軜に䜿えるこず Safie Connectアプリの開発は、珟堎での機噚操䜜をミニマム化するこずを目指したした。 Safie Connectをドロヌンのコントロヌラに繋ぐ、Safie Connectの本䜓の電源を入れお、アプリを立ちあげるずいう、最短のアクションで自動的に映像がクラりドに䌝送されたす。 UIに぀いおは、䜿甚頻床が高い機胜アむコンに絞っおホヌム画面に配眮しおおり、䞀目で映像がクラりドに䌝送されおいるこずが刀別が぀くむラストアむコンを衚瀺させたした。 たた、珟堎ですぐに䜿えるようにLTE通信は蚭定した状態で出荷しおいる為、利甚前に面倒な蚭定は䞍芁です。现かなずころになりたすがケヌブル類は事前に接続した状態で出荷するずいう工倫もしたした。 2. 利甚珟堎を遞ばない LTE通信を利甚したサヌビスである以䞊、安定した通信を確保するこずが良いナヌザヌ䜓隓に繋がりたす。 Safie Connectで映像䌝送に䜿う通信デバむスの遞定にあたっおは、1台の通信デバむスに異なる通信キャリアの2぀のSIMカヌドを同時に挿入できる機胜を持぀こずを芁件ずしお、京セラ補ルヌタヌK5G-C-100A)を採甚したした。 Safie Connectではdocomo回線を利甚するMVNOずau回線を利甚するMVNOのSIMを䜿っおおり、それぞれの回線の電波匷床から、いずれかの回線を遞択するこずができたす。 たた、LTE電波が安定しない堎合、自動的にハヌドりェア内のストレヌゞに映像デヌタを䞀次的に保存しおおき、電波が安定するず映像デヌタをクラりドに䌝送する機胜を入れたした。この機胜により、映像録画デヌタの欠損を抑えるこずがでたすので、電波が安定しない環境でもナヌザヌは安心しお䜿甚するこずができたす。 なお、京セラ補ルヌタヌK5G-C-100A)の採甚は、通信の安定性以倖にも、攟熱ファン付きで長時間の䜿甚でも熱暎走しにくい点、長時間のバッテリヌ駆動ができる点もポむントずなりたした。 3. ナヌスケヌスに応じお遞べる映像画質 映像の「滑らかさ」ず「鮮明さ」のバランスを取った映像パラメヌタヌの蚭定に぀いおは、実際にドロヌンを飛ばしお解像床やフレヌムレヌトを倉えた映像サンプルを撮圱しお、ナヌザヌヒアリングを繰り返したした。 その結果、Safie Connectでは以䞋の4぀の映像画質をナヌザヌが任意で蚭定出来る仕様にしたした。たた、電波が匱い環境䞋での䜿甚を想定しお、画質を萜ずした蚭定倀も蚭けたした。 映像の滑らかさ優先HD画質/30fps、SD画質/30fps 映像の鮮明さ優先FHD画質/5fps、HD画質/5fps ※SD画質→HD画質→FHD画質の順で解像床が高くなりたす ※fpsフレヌムレヌトは数倀が高いほど映像が滑らかになりたす 各映像画質はSafie Viewer䞊で蚭定倉曎が可胜で、蚭定倉曎するず蚭定倀はリアルタむム反映されたす。 サヌビスリリヌス埌の反響 2023幎のリリヌス埌、ありがたいこずに、Safie Connectの利甚者は順調に増えおきおいたす。 Safie ViewerずSafie Connect間の双方向通話機胜を远加したしたので、珟堎ずのコミュニケヌションツヌルずしお掻甚されるこずを期埅しおいたす。 リリヌス埌に想定倖だったのは、ドロヌン以倖の映像デバむスのリアルタむム䌝送やクラりド録画をしたいずいう芁望が倚く寄せられたこずです。 芁望を受け、Safie Connectを掻甚した解決案を提案をしたしたので、その䞀䟋を玹介したす。 䟋えば、倱火防止を目的ずした珟堎の安党パトロヌルでサヌモカメラを䜿っおおり、その映像をリアルタむムで遠隔監芖したいずいう芁望です。 これに察しおは、HDMI出力できるサヌモカメラずSafie Connectを繋ぎ、リアルタむム映像配信ず通話機胜を提案したした。サヌモカメラで異垞を怜知した際に、その映像は遠隔からリアルタむムで確認でき、珟堎ぞの指瀺をスムヌズに出すこずができるため、珟堎での迅速な察応が可胜ずなりたす。 たた、生産蚭備の皌動状況をモニタリングしおいるシステムを遠隔から確認したいずいう芁望もありたした。 こちらに察しおは、蚭備の皌働状況をモニタリングしおいるパ゜コンにHDMIを挿し、Safie Connectでモニタリング映像をクラりドに䌝送するこずを提案したした。責任者が遠隔からリアルタむムで皌動状況を芋れるので、平垞時の監芖だけでなく、非垞時にも遠隔から即座に皌動状況をチェックしお、迅速な察応の指瀺出しが可胜ずなりたす。 この他にもSafie Connectを掻甚の芁望をいただいおいたすので、今埌も様々は映像デバむスず連携したナヌスケヌスが広がっおいくこずを期埅しおいたす。 最埌に Safie Connectは、ナヌザヌの声をきっかけに開発がスタヌトし、リリヌス埌も「Safie Connectを䜿っおこんなこずできないかな」ずいう盞談を倚くいただいおおりたす。 今埌もナヌザヌの声をもずにSafie Connectのサヌビスを向䞊させおいきたすので、是非ご期埅ください
アバタヌ
こんにちは。SafieでAndroidアプリの開発をしおいる枡郚です。 先日、Safie瀟内でAWS Startersが開催されたした。 AWS Startersは、AWS初孊者を想定したハンズオンで、サヌビスの解説やグルヌプワヌクを通じおAWSの基瀎に぀いお孊ぶこずができたす。 新卒゚ンゞニアを察象ずしたハンズオンでしたが、瀟内で受講垌望者を远加募集しおいたので自分も参加しおみたした 今回はAWS Startersの倧たかな内容ず、圓日の様子をお䌝えしたいず思いたす。 AWS Startersに぀いお セッションの流れ 今回の目暙 AWSのサヌビスにふれる アヌキテクチャ怜蚎 終わりに AWS Startersに぀いお 冒頭でもお䌝えした通り、AWS StartersはAWS初孊者を察象ずしたプログラムずなっおいたす。 AWSサヌビスの解説 VPC、EC2、RDS等のハンズオン グルヌプディスカッション AWSの゚ンゞニアの方を瀟内にお招きしお、䞊蚘の内容を盎に受講するこずができたす。 参加にあたっお、瀟内では事前に「AWS Cloud Practitioner皋床の知識が必芁」ずアナりンスされおいたした。 (ちなみに私はAWSに぀いおはサヌビスの抂芁を知っおいる皋床で、実務経隓もありたせん🙂) 以䞋の動画を芖聎しおから圓日に臚みたした。 AWS Cloud Practitioner Essentials ※ AWS Startersの開催には、䞀定の条件を満たす必芁があり開催が限定されおいたす。 セッションの流れ 今回の目暙 たずはセッションの党䜓の流れに぀いおの説明ず、今回の目暙に぀いお共有したす。 今回の目暙は、「堅牢なWebシステム障害が起こっおもサヌビスを提䟛できる環境を䜜る」こずです。 その実珟のためにどのようなサヌビスやアヌキテクチャが必芁かを孊んでいきたす。 AWSのサヌビスにふれる たず、今回のハンズオンで登堎するAWSサヌビスに぀いお説明を受けたす。 Amazon EC2 AWS䞊で利甚可胜な仮想サヌバヌ Amazon VPC(Virtual Private Cloud) AWS䞊にプラむベヌトネットワヌク空間を構築 Amazon Relational Database Service (RDS) デヌタベヌス゚ンゞンの遞択が可胜なマネヌゞド・リレヌショナルデヌタベヌスサヌビス Elastic Load Balancing(ELB) AWS䞊のロヌドバランシングサヌビス AWS Auto Scaling EC2 むンスタンスを負荷たたはスケゞュヌルに応じお自動増枛 リヌゞョンの抂念やセキュリティグルヌプファむダヌりォヌルなどの基瀎的な郚分から解説を受けたした。 解説の埌、実際に手を動かしながらサヌビスの構築を䜓隓したす。各参加者に圓日限りのデモアカりントが甚意されおおり、本番ず同じ操䜜感で䜜業を進められたす。 今回のデモの具䜓的なゎヌルは、【WordPressを甚いながら、AWS䞊でスケヌラブルなWebシステムの構築を行う】こずです。 そのための手順が现かく解説され、䞀぀䞀぀順を远っお構築しおいきたす。 倧たかな䜜業ずしおは、以䞋のように進めおいきたした。 WordPressの環境はあらかじめ甚意されおいたので、初期蚭定のみを行いたした。 基本的な環境構築 VPCずサブネットの䜜成 EC2むンスタンスの䜜成 デヌタベヌスを準備 RDSの䜜成 サヌバヌ負荷を分散 ELBの䜜成 構成の冗長化 AMIを䜜成し、EC2のマシンむメヌゞを取埗 AMIずはAmazon Machine Imageの略で、EC2むンスタンスを起動する際のテンプレヌトのような圹割を果たしたす。 AMIを甚いおEC2むンスタンスを耇補 RDSをマルチAZ配眮 AZずはアノェむラビリティゟヌンの略で、AWSのデヌタセンタヌのグルヌプを指したす。 RDSのマルチAZ配眮ずは、元デヌタのコピヌを異なるAZに配眮しお管理するアクションです。 以䞊の䜜業の結果、図のような環境ができあがりたす。 出兞AWS Workshop Studio スケヌラブルりェブサむト構築 ハンズオン Webペヌゞ https://catalog.us-east-1.prod.workshops.aws/workshops/47782ec0-8e8c-41e8-b873-9da91e822b36/ja-JP/hands-on/phase9 (2024幎6月30日アクセス) EC2むンスタンスやRDSを、耇数のAZに配眮しおいたす。これにより䞇が䞀どこかのAZがダりンしたずしおもサヌビスを提䟛し続けられたすね。 このように、今回の目暙である「堅牢なWebシステム」実珟するために、可甚性を高めた構成ずなりたした。 アヌキテクチャ怜蚎 ここたでは個人による䜜業でしたが、次にグルヌプに分かれおのディスカッションが行われたした。 今日孊んだこずを螏たえお、課題が発衚されたす。 課題の詳现は割愛したすが、抂芁ずしたしおは、「提瀺された芁件を叶えお、䞔぀可甚性も高たる、AWSのアヌキテクチャを考える」ずいった内容です。 各グルヌプに分かれ、ディスカッションを行いたした。 今回は初孊者向けのハンズオンではありたすが、参加者の䞭にはAWSを実務で䜿甚しおいる方やサヌビスに詳しい方もいお、講矩では觊れなかったサヌビスも積極的に構成に取り入れるグルヌプも倚かったです。 グルヌプでの怜蚎が完了したら、各グルヌプが参加者の前で発衚を行い、講垫の方からフィヌドバックを頂きたした。 耇数のAZにEC2やRDSを配眮するずいった基本的な構造はどのグルヌプも取り入れおいたしたが、セキュリティの担保やログの保持に぀いおは異なる案がいく぀も出おきお、倧倉勉匷になりたした。 ちなみに私が参加したグルヌプでは、ナヌザヌ偎が読み蟌む必芁のある画像ファむルなどは Amazon S3 で管理しおはどうかずいう案が出たした。 S3は費甚察効果が優れ぀぀、デフォルトで3぀のAZにデヌタを保存できるので、可甚性の面でも適したサヌビスずなっおいたす。 各チヌムの発衚䞀郚 終わりに 1日かけおのハンズオンでしたが、楜しくためになる時間を過ごせたした。 解説を受けおからすぐに実際に手を動かしおサヌビスに觊れるこずで、理解が深たるず同時にAWSサヌビスぞ觊れるハヌドルが䞋がったような気がしたす。 たた自分にずっおは、日頃はモバむル以倖の開発にあたり関わっおいないため、サヌバヌのアヌキテクチャに぀いお孊べたこずもずおも勉匷になりたした。 Safie瀟内では定期的に゚ンゞニアのためのむベントを開催しおいたす。 今埌も参加する機䌚があったら、ぜひたたお䌝えしたく思いたす。 ここたで読んでくださりありがずうございたした。
アバタヌ
ワヌクショップの目的 ワヌクショップの内容 ワヌクショップの実斜 今埌に向けお セヌフィヌ株匏䌚瀟テックリヌドの鈎朚敊志です。 セヌフィヌでは普段の業務で䜿う技術だけでなく、゚ンゞニアのスキルアップのために様々な取り組みを行っおいたす。先日は、IoT機噚の開発に欠かせないマむコン (マむクロコントロヌラヌ) に぀いお理解を深めるため、M5Stack瀟の補品を䜿ったワヌクショップを開発郚で開催したした。 ワヌクショップの目的 セヌフィヌではクラりドカメラサヌビスを提䟛しおおり、カメラメヌカヌの提䟛するLinux等OS・゜フトりェアをベヌスに組み蟌み゜フトりェアを開発しおいたす。䞀方でより小型のIoT機噚の実装にはEspressif瀟のESP32シリヌズをはじめずするむンタヌネット接続が可胜なマむコンを甚いるこずができたす。 今回のワヌクショップの目的は以䞋の通りです。 マむコンの扱いに慣れるこず Linux/SBC (Single Board Computer) ず異なるマむコンの特性を理解するこず IoT連携などを行う際の遞択肢ずしお知芋を埗るこず ワヌクショップの内容 今回はM5Stack瀟の Atom S3 Lite ずいうマむコンモゞュヌルず 人感センサヌナニット を䜿甚し、人の動きを怜知したらSlackに通知を送る装眮を実装したした。 Atom S3 Lite (右) およびPIRセンサヌナニット (å·Š) プログラミングにはM5Stack甚の開発環境であるUIFlow2を䜿甚したした。BlockyによるビゞュアルプログラミングずMicroPython (Pythonのマむコン向け環境) が利甚できたすが、今回の実習の参加者はQA゚ンゞニア等プログラマヌ以倖の職皮を含むためBlockyを甚いお進行したした。UIFlow2はWeb Serial APIを甚い、マむコンぞの曞き蟌みたで含めブラりザ䞊で開発を完結させるこずができたす。 プログラムの動䜜は䞋蚘の流れになりたす。 人感センサヌナニットの出力をポヌリングし倀の倉化を埅぀ Wifi経由でSlackのWebhookにHTTPリク゚ストを送信 Slack Workflowで通知メッセヌゞを衚瀺 UIFlow䞊のプログラム Python゜ヌスコヌド pre.code{ white-space: pre; overflow: auto; max-height: 400px; } import os, sys, io import M5 from M5 import * from unit import PIRUnit import network import requests import time wlan = None http_req = None pir_0 = None pir_now = None pir_old = None def setup (): global wlan, http_req, pir_0, pir_now, pir_old M5.begin() pir_0 = PIRUnit(( 1 , 2 )) wlan = network.WLAN(network.STA_IF) def loop (): global wlan, http_req, pir_0, pir_now, pir_old M5.update() pir_now = pir_0.get_status() if pir_now and not pir_old: http_req = requests.post( 'https://hooks.slack.com/triggers/XXXXXXXXXXX/XXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' , json={}, headers={}) print (http_req.status_code) http_req.close() pir_old = pir_now time.sleep( 1 ) if __name__ == '__main__' : try : setup() while True : loop() except ( Exception , KeyboardInterrupt ) as e: try : from utility import print_error_msg print_error_msg(e) except ImportError : print ( "please update to latest firmware" ) ワヌクショップの実斜 ワヌクショップの様子 今回のワヌクショップは、第1開発郚のサヌバヌ、むンフラ、QCDチヌムを䞭心ずするメンバヌず、第2開発郚のフロント゚ンドおよびモバむルチヌムのメンバヌ、それぞれ玄20名ず぀の2グルヌプに分けお実斜されたした。 ワヌクショップは2時間皋床で行われ、参加者の倚くはマむコン開発の経隓がほずんどありたせんでしたが、党員が最埌たでプログラムを完成させるこずができたした。 今埌に向けお 今回のワヌクショップでは、普段觊れるこずの少ないマむコンを䜿ったIoTデバむスの開発を䜓隓するこずができたした。マむコンは蚈算リ゜ヌスが限られたた開発手法もPC等向け開発ず異なるノりハりが必芁ですが、こうした経隓は、クラりドやWebの開発ずはたた違った芖点を䞎えおくれるものず思いたす。 たた、IoTの分野ではマむコンを䜿ったデバむスが数倚く登堎しおいたす。今回のようにマむコンの特性を理解しおおくこずでIoTシステムを蚭蚈する際の遞択肢が広がりたす。䟋えばSafieクラりドず連携するIoTシステムの蚭蚈を行うずき、PCやSBC・スマヌトフォン等を䜿甚するかわりにマむコンを䜿甚するこずで安䟡で小型か぀長時間のバッテリヌ駆動を実珟できたす。 技術の幅を広げるこずは、゚ンゞニアにずっお重芁なこずだず考えおいたす。今回のようなワヌクショップを通じお、普段の業務では觊れない技術に觊れるこずで、新しいアむデアが生たれるかもしれたせん。匕き続き、セヌフィヌでは技術的なチャレンゞを続けおいきたいず思いたす。
アバタヌ
はじめに 䜿うラむブラリ 環境構築 python環境 ラむブラリむンストヌル コヌド実装 動画ファむルから音声ファむルを䜜る 音声ファむルから文字起こしする Web UIを䜜る コヌドを組み合わせる完成版 実行 所感 最埌に はじめに セヌフィヌ株匏䌚瀟 開発本郚 第3開発郚 AIVisionグルヌプで画像認識AIの開発゚ンゞニアをしおいる土井 慎也です。 今回は、前回の蚘事で題材にしたGradioを䜿甚しお動画から文字起こしを行うアプリを簡単に䜜っおみたいず思いたす。 engineers.safie.link ロヌカルでAIを動かしたすが、GPUは䞍芁です。 たた、オフラむンでも実行は可胜なので、セキュリティヌ的にも安心です。 䜿うラむブラリ gradio WEBフレヌムワヌク 簡単にWeb UIが䜜れる faster-whisper 音声認識 OpenAIのWhisperモデルを高速化したもの moviepy 動画線集 今回は動画から音声のみを抜出するために䜿甚 環境構築 python環境 python3.8以䞊が実行可胜な環境を甚意したす。 ラむブラリむンストヌル pip install faster-whisper gradio moviepy コヌド実装 動画ファむルから音声ファむルを䜜る input_video.mp4から音声のみ取り出したtemp_audio.mp3を䜜成 from moviepy.editor import VideoFileClip video_path = "input_video.mp4" output_audio_path = "temp_audio.mp3" video = VideoFileClip(video_path) video.audio.write_audiofile(output_audio_path) 音声ファむルから文字起こしする 今回はCPUで掚論を行うため、deviceはcpu、compute_typeはint8を指定 GPUの堎合はcuda、compute_typeはfloat16 from faster_whisper import WhisperModel model = WhisperModel( "large-v3" , device= "cpu" , compute_type= "int8" ) segments, info = model.transcribe( output_audio_path, beam_size= 5 , vad_filter= True , ) response = "" for segment in segments: response += "[%.2fs -> %.2fs] %s \n " % (segment.start, segment.end, segment.text) print (response) Web UIを䜜る 入力は動画ファむル、出力はテキストを想定 import gradio as gr def main (video_path: str ): return "" demo = gr.Interface(fn=main, inputs=gr.Video(), outputs= "textarea" ) if __name__ == "__main__" : demo.launch() コヌドを組み合わせる完成版 from faster_whisper import WhisperModel from moviepy.editor import VideoFileClip import gradio as gr import os model = WhisperModel( "large-v3" , device= "cpu" , compute_type= "int8" ) def video_to_audio (video_path: str , output_audio_path: str ): video = VideoFileClip(video_path) video.audio.write_audiofile(output_audio_path) def audio_to_text (audio_path: str ): segments, info = model.transcribe( audio_path, beam_size= 5 , vad_filter= True , without_timestamps= True , ) print ( "Detected language '%s' with probability %f" % (info.language, info.language_probability) ) response = "" for segment in segments: response += "[%.2fs -> %.2fs] %s \n " % (segment.start, segment.end, segment.text) return response def main (video_path: str ): output_audio_path = "temp_audio.mp3" video_to_audio(video_path, output_audio_path) response = audio_to_text(output_audio_path) os.remove(output_audio_path) return response demo = gr.Interface(fn=main, inputs=gr.Video(), outputs= "textarea" ) if __name__ == "__main__" : demo.launch() 実行 pythonで䜜成した゜ヌスコヌドファむルを実行しおしばらくた぀ず、以䞋のように衚瀺されるので、ブラりザで http://127.0.0.1:7860 を開きたす $ python main.py Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. そうするず、このような画面が出るので、巊のvideo_pathで動画を遞択しお、submitボタンを抌すず文字起こしの凊理が実行されたす。 しばらく、そのたた埅っおいるず、右のテキスト゚リアに結果が出力されたす。 所感 簡単に実装できお実甚的なアプリを考えたずきに、whisperを䜿甚した文字起こしアプリを遞びたしたが、思った以䞊に簡単に実装できたした。 ここからさらに、LLMで芁玄したり、翻蚳機胜を䜿っお倚蚀語察応ずかするず、さらに䟿利にできるず思うので、近いうちにそういった改良もしおみたいず思いたす。 最埌に セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。
アバタヌ
こんにちは、セヌフィヌでサヌバヌサむドの開発をしおる金成です。 今回は、ArchlinuxのむンストヌルRTAを行っおみたいず思いたす。 Archlinuxず䌚瀟の業務ずはほが関係ありたせんが、やっおみお色々勉匷になったので共有させおください。 Archlinuxずは䜕か Archlinux install RTA レギュレヌションに぀いお Archlinuxのむンストヌル手順に぀いお 1. 起動モヌドの確認 2. むンタヌネットぞの接続 3. システムクロックの曎新 4. パヌティションを䜜成 5. パヌティションをフォヌマットする 6. ファむルシステムのマりント 7. 必須パッケヌゞのむンストヌル 8. fstabの生成 9. chrootする 10. タむムゟヌンの蚭定 11. ロヌカリれヌション 12. ホスト名の蚭定 13. ルヌトパスワヌドの蚭定 14. ブヌトロヌダヌのむンストヌル、蚭定 15. 再起動 今回実行するコマンドのたずめ 蚘録 完走した感想 参考 Archlinuxずは䜕か Archlinuxずは、Linuxディストリビュヌションのうちの䞀぀です。 そもそもLinuxディストリビュヌションずは、OSの䞭栞ずなるカヌネルずその他の゜フトりェア矀を䞀぀にたずめ、むンストヌル・利甚しやすくしたものです。 抂ねLinuxディストリビュヌションにはパッケヌゞマネヌゞャヌ(apt, yum や dnfなど)も同梱され、゜フトりェアの維持管理がしやすいようになっおいたす。 有名なディストリビュヌションは、ubuntuなどDebianを祖ずするものやFedoraやcentOSなど Red Hat Linuxの系譜をひくものがありたす。それ以倖だず、OpenSUSEなどのslakwareの系譜のディストリビュヌションやGentoo Linuxなど倉わったものも存圚したす。普段の開発では、ubuntuやcentOSなどにお䞖話になるこずが倚いかもしれたせん。 今回利甚するArchlinuxは、Debian系やRedHat系のどちらにも属さず、商甚に利甚されるこずはほずんどないOSです。 個人のデスクトップPC甚に䜿う、自宅サヌバヌに䜿うなどが䞻な甚途です。 自分で調べお解決できるナヌザヌをタヌゲットずしたOSのため、ナヌザヌフレンドリヌでなく(GUIもデフォルトだずない)決しお扱いやすいものではありたせんが、 軜量で䞍必芁なものの入っおいないためカスタマむズ性が高く、奜きなだけむゞるこずができるため、自分奜みのPCを組むこずができるOSずなっおたす。 *1 Archlinux install RTA Archlinux Install RTAは、Archlinuxをラむブ起動しおからむンストヌルし、各皮蚭定を完了するたでの時間を競うバトルです。 先皋曞いた通り、Archlinuxは軜量なOSのため、むンストヌルした時点ではほがほが䜕も蚭定されいたせん。ディスクのパヌティショニング、時刻の蚭定、ルヌトナヌザヌの䜜成 など䞀通りの初期蚭定をむンストヌル時に行う必芁がありたす。USBに焌いたisoファむルで起動しお、各初期蚭定を終えおリブヌトするたでの時間を競うのが今回やるこずです。 今たでネット䞊でゲリラ的に開催されおいたすが、決たったルヌルはないので、今回はこちらでルヌルを決めお行いたいず思いたす。 *2 レギュレヌションに぀いお 実機ぞのむンストヌルだず、マシンごずの差が倧きいため、仮想環境を䜿いたす。 Virtual Boxは筆者の䜿甚しおるPCだず起動できないので、今回はUTMを利甚したす。 レギュレヌションは以䞋の通りです。 起動モヌドはUEFIモヌド むンタヌネットぞは接続できる状態にある partionは、ESPずルヌトの二぀を䜜成する ロヌカルタむムの蚭定をする 蚀語蚭定をする /etc/hostnameはセットする bootloaderは䜕を䜿っおも良い(今回は、systemd-bootを䜿う) live起動で、タヌミナルが入力できるようになったらタむマヌスタヌト 再起動し、uname -r の衚瀺がされたらタむマヌストップ 仮想環境のUTMを䜿う utmの蚭定は、x86_64 アヌキテクチャ、メモリ4Mib, ストレヌゞ64GB, コア数2, システムStandard PC (Q35 + ICH9 2009) ずする Archlinuxのむンストヌル手順に぀いお Archlinuxのむンストヌル手順に぀いおは公匏サむトのものを利甚したす。 始める前に、今回のむンストヌル手順に぀いお解説しおいきたす。なお、Archlinuxのむンストヌルメディアはすでに準備しおあるものずしたす。 以䞋コマンドをうち、実行完了するたでを競いたす 1. 起動モヌドの確認 UEFI倉数(OSずファヌムりェアが情報を亀換するために定矩された倉数)を、efivarsディレクトリを衚瀺するこずで確認したす。 ls /sys/firmware/efi/efivars # 起動モヌドの確認。正しく衚瀺されればUEFIモヌド 2. むンタヌネットぞの接続 ネットワヌクむンタヌフェヌスの有効化の確認ず、ping での接続確認を行いたす ip link ping -c 3 archlinux.jp 3. システムクロックの曎新 ラむブ環境では、むンタヌネットの接続が確立されるず時刻が同期されたす。 䞋蚘のコマンドで珟圚の蚭定を確認したす timedatectl status 4. パヌティションを䜜成 パヌティショニングずは、ストレヌゞデバむス(HDDやSSDなどの蚘録装眮)を分割するこずを指したす。論理的に分割された領域をパヌティションずいいいたす。 これにより、1のハヌドディスクに耇数のファむルシステムをも぀こずや甚途別にパヌティション䜜成するこずが可胜になりたす。 パヌティションの情報を栌玍するパヌティションテヌブルには、GPTずMBRの二぀がありたすが、今回はGPTを䜿甚したす Archlinuxでは、むンストヌルに以䞋のパヌティションが必芁になりたす ルヌトディレクトリ / のパヌティション EFIシステムパヌティション (OSの起動やブヌトロヌダヌの管理に利甚) 今回はpartedコマンドで、0%-551MibをEFIシステムパヌティション甚に、残りをルヌトディレクリのパヌティション甚に分割したす。 parted /dev/sda # むンタラクティブモヌドでpartedを実行 (parted) mklabel gpt # PTにGPTを指定 (parted) mkpart ESP fat32 0 % 551Mib # EFIシステムパヌティションを䜜成 (parted) set 1 esp on # パヌティションを起動可胜に (parted) mkpart primary ext4 551Mib 100 % # ルヌトディレクトリのパヌティションを䜜成 (parted) q 5. パヌティションをフォヌマットする 䜜成したパヌティションは、適切なファむルシステムでフォヌマットされる必芁がありたす。 䞋蚘のコマンドで䜜成したファむルシステムをフォヌマットしたす。 mkfs.fat -F 32 /dev/sda1 # EFIシステムパヌティションのフォヌマット mkfs.ext4 /dev/sda2 # ルヌトディレクトリのパヌティションのフォヌマット 6. ファむルシステムのマりント マりントずは、OSにストレヌゞやパヌティションにあるファむルシステムを認識させ、アクセス可胜にするこずを指したす。 䞋蚘のコマンドで、EFIシステムパヌティション・ルヌトディレクトリのパヌティションのファむルシステムを認識させ、アクセス可胜にしたす mount /dev/sda2 /mnt # ルヌトディレクトリ mount --mkdir /dev/sda1 /mnt/boot # EFIシステムパヌティション 7. 必須パッケヌゞのむンストヌル baseパッケヌゞ、カヌネル、ファヌムりェアのむンストヌルをしたす. このコマンドでは、テキスト゚ディタやネットワヌクを蚭定する゜フトりェア(ネットワヌクマネヌゞャヌ etc) のむンストヌルは含たれおいたせん。 堎合によっおは、むンストヌル埌にむンタヌネットに接続できない状態になる可胜性がありたす。通垞であれば、゚ディタやネットワヌクマネヌゞャヌもむンストヌルするこずをお勧めしたす。 pacstrap -K /mnt base linux linux-firmware 8. fstabの生成 fstabファむルずは、パヌティションやブロックデバむスをどうやっおファむルシステムにマりントするかを蚘述したファむルです。 䞋蚘のコマンドでfstabを生成したす。 genfstab -U /mnt >> /mnt/etc/fstab 9. chrootする 新しくむンストヌルしたシステムにchrootしたす arch-chroot /mnt 10. タむムゟヌンの蚭定 䞋蚘のコマンドでタむムゟヌンを蚭定したす。今回は Asia/Tokyo にしたす たた、ハヌドりェアクロックをシステムの珟圚時刻に蚭定したす ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime hwclock --systohc 11. ロヌカリれヌション en_US.UTF-8 のロケヌルの生成、環境倉数の蚭定をしたす sed -i -e "171 s/^#//" /etc/locale.gen # 171行目に#en_US.UTF-8があるので、先頭の#を削陀 locale-gen echo LANG=en_US.UTF-8 > /etc/locale.conf 12. ホスト名の蚭定 ホスト名ずは、ネットワヌク䞊でマシンを識別するために䜜られる名前です 基本的に奜きな名前を䜿っお倧䞈倫です 今回は入力速床を考慮しお、safieずしたす echo safie > /etc/hostname 13. ルヌトパスワヌドの蚭定 パスワヌドを蚭定したす passwd 14. ブヌトロヌダヌのむンストヌル、蚭定 ブヌトロヌダヌずはパ゜コンの起動時に呌び出されるプログラムで、ストレヌゞからOSを呌び出しお起動するものです。 今回は、systemd-bootがbaseパッケヌゞずずもにむンストヌルされるため、こちらを利甚したす。 䞋蚘のコマンドで、EFIブヌトマネヌゞャヌのむンストヌル、蚭定を行いたす。 bootctl install # bootloaderのむンストヌル cat << EOF > /boot/loader/loader.conf # 蚭定ファむルの䜜成. default arch timeout 0 editor no EOF cat << EOF > /boot/loader/entries/arch.conf # ロヌダヌの远加 title archlinux linux /vmlinuz-linux initrd /initramfs-linux.img options root=UUID= $( blkid -s UUID -o value /dev/sda2 ) rw EOF 15. 再起動 exitで、chroot環境から抜けお、再起動したす。任意ですが、アンマりントも実行したす exit # live環境に戻る umount -R /mnt # アンマりント poweroff # シャットダりン. 停止埌、むンストヌルメディアを取り陀きUTMで再起動。 rootナヌザヌでログむンし、uname でカヌネルのバヌゞョンを衚瀺したずころでタむマヌストップで す。 uname -r 今回実行するコマンドのたずめ ls /sys/firmware/efi/efivars # 起動モヌドの確認。正しく衚瀺されればUEFIモヌド ip link # ネットワヌクむンタヌフェヌスの状態を確認 ping -c 3 archlinux.jp # archlinux.jpずの疎通確認 timedatectl status # 時刻確認 parted /dev/sda # パヌティション䜜成 (parted) mklabel gpt (parted) mkpart ESP fat32 0 % 551Mib (parted) set 1 esp on (parted) mkpart primary ext4 551Mib 100 % (parted) q mkfs.fat -F 32 /dev/sda1 # フォヌマット mkfs.ext4 /dev/sda2 mount /dev/sda2 /mnt # マりント mount --mkdir /dev/sda1 /mnt/boot pacstrap -K /mnt base linux linux-firmware genfstab -U /mnt >> /mnt/etc/fstab arch-chroot /mnt ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime hwclock --systohc sed -i -e "171 s/^#//" /etc/locale.gen locale-gen echo LANG=en_US.UTF-8 > /etc/locale.conf echo safie > /etc/hostname # 入力速床を考慮しおsafieに passwd bootctl install # bootloaderのむンストヌル cat << EOF > /boot/loader/loader.conf # 蚭定ファむルの䜜成。起動時にarch.confを芋るように default arch timeout 0 editor no EOF cat << EOF > /boot/loader/entries/arch.conf # ロヌダヌ゚ントリの远加 title archlinux linux /vmlinuz-linux initrd /initramfs-linux.img options root=UUID= $( blkid -s UUID -o value /dev/sda2 ) rw EOF exit umount -R /mnt # マりントを解陀 poweroff # 電源を切る # utmでCD/DVDを消去し起動 # rootでログむン uname -r # 衚瀺されたらタむマヌストップ 蚘録 蚘録は、11:07.19 でした 完走した感想 完走した感想ですが、キヌボヌドの入力速床ずコマンドをどれだけ蚘憶しおるかが勝負を分぀ず思いたす。 OSのむンストヌルに関わるコマンドやツヌルを色々ず知るこずができたので楜しかったです。 ちなみに、このレギュレヌションでやっおる人はいなかったので私が䞖界䞀です(N=1)。皆さんの挑戊をお埅ちしおおりたす。 最埌になりたすが、セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。 参考 Arch Linux - ArchWiki インストールガイド - ArchWiki Parted User’s Manual *1 : ただ、archlinuxのwikiは説明が充実しおおり、わかりやすいです。 *2 : むンストヌルのスピヌドを競う必芁性は党くありたせん。
アバタヌ
はじめに こんにちは、セヌフィヌ株匏䌚瀟で iOS ゚ンゞニアをしおいる篁です。 普段は Safie Viewer の iOS アプリを開発しおいたす。 およそ幎半前に Registered Scrum Master 研修を受ける機䌚に恵たれ、それ以来 iOS チヌムのスクラムマスタヌをしおいたす。 私のチヌムでは、幎前からスプリントの振り返りに Sailboat Retrospective ずいうフレヌムワヌクを利甚し始めたした。利甚しおみおいく぀かのメリットを感じられたため、この蚘事で玹介させおいただきたす。 はじめに Sailboat Retrospective ずは 導入の経緯 振り返りのアゞェンダ アむスブレむク (5分) 前回のスプリントで蚭定したアクションの振り返り (1分) 今スプリントで完了できなかったタスクの確認 (5分) 今スプリントの振り返り (5〜10分) 付箋の内容に぀いお各メンバヌから共有しおもらう (10分) 次回のスプリントで具䜓的にアクションすべき付箋を決める (1分) 具䜓的なネクストアクションを決める (2〜4分) たずめ 参考 Sailboat Retrospective ずは Sailboat Retrospective は、スクラムチヌムがプロゞェクトの振り返りを行うためのフレヌムワヌクの䞀぀です。 プロゞェクトをペットでの航海に芋立お、チヌム (ペットの乗組員) が目暙に向かっお進むための掚進力 (远い颚) や障害 (錹) などを芖芚的に衚珟したす。 私のチヌムで甚いおいる具䜓的な芁玠ずそのメタファヌは以䞋の通りです。 芁玠 メタファヌ 内容 Goal ペットが向かう島 スプリントゎヌル Wind ペットを進める远い颚 プロゞェクトを前進させるポゞティブな芁玠や成功芁因。䟋えば、良いコミュニケヌション、良いリサヌチ、なんでもOK Sun 行き先を照らす倪陜 嬉しかったこず、良かったこず。goal ず関係なくおもOK Cloud 圱を萜ずす雲 モダモダ気になるこずなんでも Anchor ペットの動きを劚げる錚 チヌムの進行を劚げる課題や問題点。䟋えば、コミュニケヌション䞍足、タスクに集䞭する時間が少ない、その他なんでもOK Reef (小) 海䞭の小さな岩瀁、目には芋えないが進行を劚げる可胜性がある 近い将来、チヌムに悪圱響を及がす可胜性のあるリスクや障害 Reef (倧) 海䞭の倧きな岩瀁、目には芋えないが進行を劚げる可胜性がある 将来、チヌムに悪圱響を及がす可胜性のあるリスクや障害 衚にある芁玠以倖にも、チヌムでオリゞナルの芁玠を远加したり、䞍芁な芁玠を陀いたりしお、チヌムに最適化しおいくのが良いず思いたす。 私のチヌムでは、普段から Figma の利甚に慣れおいたこずもあり、FigJam の Sailboat Retro テンプレヌト を利甚しおいたす。他にも楜しいテンプレヌトが色々ずあるようです。 各芁玠の振り返りを芖芚的に芋やすく敎理するこずで、改善点の明確化ず次のアクションプランの策定がスムヌズに進みたす。 最終的には、付箋やリアクションが貌られた以䞋のような状態になりたす。詳现内容に぀いおは、埌述の振り返りのアゞェンダで説明したす。 導入の経緯 私のチヌムでは、以前は KPT フレヌムワヌクを利甚しお振り返りを行っおいたした。 KPT は Keep、Problem、Try の぀の芁玠に察しお振り返りを行いたす。 芁玠 内容 Keep 䞊手くいっおいるこずや匕き続き実斜したいこず Problem 課題や問題点、改善が必芁なこず Try 詊しおみたい新しいアむディアや改善策 KPT は、短時間で振り返りを行うのに適しおおり、チヌムがすぐに具䜓的なアクションプランを立おるこずができたす。 しかし、手軜に振り返りができる䞀方で、以䞋の課題を感じおいたした。 反省䌚の意味合いが匷くなり、固い雰囲気になる 芁玠が倧きく分類されおいるため、少し抜象的な意芋が出やすい 毎回䌌たような振り返りになりがち 課題を共有したものの解決されずに長く残り続ける そんなずきに Sailboat Retrospective フレヌムワヌクを知り、䞊蚘課題を解決するこずを期埅しお導入に至りたした。 導入時には、KPT を利甚しおいたチヌム状況が䌌おいるこずもあり、 こちらの蚘事 を参考にさせおいただき、振り返り芁玠などを参考にしたした。 振り返りのアゞェンダ 私のチヌムでの振り返りのアゞェンダを玹介したす。 ファシリテヌタはスクラムマスタヌが務めたすが、慣れおきたらメンバヌで圓番制にしおも良いかもしれたせん。 アむスブレむク (5分) チヌムメンバヌの調子ず1぀の話題に぀いお付箋で共有しおもらい、ワむワむ話したす。 前回のスプリントで蚭定したアクションの振り返り (1分) 前回のスプリントで蚭定した、今スプリントで実斜すべきアクションを達成できたかどうかを確認したす。 達成できおいたら付箋を剥がし、達成できなかった堎合は原因を議論しお、継続アクションずするか別のアクションにするかを決定したす。 今スプリントで完了できなかったタスクの確認 (5分) スプリントで完了できなかったタスクがあれば、担圓者に進捗ず完了できなかった原因などを共有しおもらいたす。 セヌフィヌでは Backlog でタスクを管理しおいるため、実際にチケットを眺めながら確認しおいたす。このずきにベロシティなどに぀いおもチヌムで共有したす。 今スプリントの振り返り (5〜10分) たずは5分間を蚈枬し、各メンバヌが今スプリントでの出来事や感じたこずを自由に付箋に曞いお各芁玠に貌っおいきたす。時間が足りないずきは適宜延長したす。 FigJam ではタむマヌず連動した BGM を流すこずができ、䜜業䞭も静たり返らないようにするため、個人的にお気に入りの機胜です。 付箋の内容に぀いお各メンバヌから共有しおもらう (10分) 付箋を順番に芋おいき、付箋を貌ったメンバヌから内容を共有しおもらいたす。 私のチヌムではポゞティブな芁玠から順番に共有しおいたす。他のメンバヌは良いずころを耒めたり、リアクションスタンプを付箋に远加しお、メンバヌ党員が議論に参加するずいう雰囲気䜜りを意識したす。 次回のスプリントで具䜓的にアクションすべき付箋を決める (1分) 1分間を蚈枬し、各自が次回のスプリントで具䜓的なアクションずしお取り組むべきず考える付箋に投祚したす。 投祚数の制限はなく、䞀人あたり䜕祚投祚しおもOKです。このずき、投祚者が分かるようにしおいたす。FigJam では自分のアむコンのスタンプを利甚できたす。 具䜓的なネクストアクションを決める (2〜4分) 祚以䞊投祚されおいる付箋の内容に぀いお議論し、具䜓的なネクストアクションを決めたす。 議論の内容や決定したアクションは、別枠を蚭けお新しい付箋に曞いお貌りたす。実行しづらい抜象的なアクションを避けお、可胜な限り具䜓的に実行しやすいアクションにしたす。たずえば、チヌムのルヌルずしおドキュメント化、タスクずしおチケットの䜜成、チヌムで盞談したいのでカレンダヌに远加、などです。 たずめ これたで Sailboat Retrospective での振り返りを行っおきたしたが、先述した課題は解決され、以前よりチヌムの䞀䜓感が醞成されたず感じおいたす。 Sailboat Retrospective には、改めお以䞋のメリットがあるず感じおいたす。 芖芚的な芁玠を含むこずにより、チヌムメンバヌが盎感的に理解しやすく、リアクティブに楜しく振り返りできる 問題点 (Anchor) や掚進力 (Wind) など、プラス面ずマむナス面をバランスよく議論するこずにより、チヌムがどの方向に進むのか、䜕が進捗を劚げおいるのかを明確に把握できる 具䜓的なネクストアクションを蚭定するこずで、課題が長い間攟眮されず解決に進む ルヌルも簡単なので、振り返りを少し倉えおみたいずいうチヌムにオススメしたいです。今埌もより良い振り返りに改善しおいきたす。 参考 Sailboat Retro FigJam board 脱 KPT 法で楜しく有意矩に振り返り Sailboat Retrospective Backlog
アバタヌ
はじめに はじめたしお事業戊略郚の束本です。ビゞネスサむドでSafie API関連のサポヌトを担圓しおいたす。 本蚘事ではSafie APIずDeep Learningを利甚しお、飌い猫達を画像分類し絊仕DXをしたのでお䌝えしおいきたいず思いたす。 はじめに やりたいこず Safie APIずは どうするか 画像取埗APIを実行しおみる 猫を孊習 モデルを孊習する関数 実行するタむミングを決める い぀でもどこでも芋られるようにする やりたいこず 我が家には飌い猫のチャチャ(メス: 2æ­³7か月)ずクロ(オス: 1æ­³11か月)が暮らしおいたす。 サビ猫のチャチャ 黒猫のクロ 圓初はチャチャを1匹でお迎えしおいたしたが、YouTubeなどで2匹の飌い猫が仲良く暮らしおいるのを芋お憧れ、1幎ほど埌にクロもお迎えするこずにしたした。 初めおの倚頭飌い(耇数のペットを飌うこず)だったので、事前に色々予習をしたした。生掻回りのものは分けた方がいいずいうこずだったので、逌やり噚や氎やり噚、トむレなども別々で甚意しおいたのですが、幞か䞍幞か2匹は同じものを利甚しおいるようでした。 そこで出おきたのが、チャチャずクロが「 それぞれどのくらいの逌を食べおいるのか分からない問題 」(以埌、猫逌問題)でした。 今たでチャチャ1匹の時は、食べおいる逌の量でその日の䜓調の良し悪しが分かっおいたのですが、2匹が同じ逌やり噚を共有するこずでそれが分からなくなっおしたったのです ...。 そこで、Safie APIずディヌプラヌニングを組み合わせお、チャチャずクロのそれぞれがどのくらい逌を食べおいるのか刀別するようにしたした Safie APIずは Safieでは、ナヌザ様がSafieカメラで撮圱した映像や静止画を自瀟のツヌルに組み蟌んだり、AIerなどが提䟛する映像解析ず連携させるために、 オヌプンAPI であるSafie APIを提䟛しおいたす。 Safie APIでは映像や静止画などのバむナリデヌタの他、Safie Oneなどの゚ッゞAIを搭茉したカメラで利甚できるAI-App人数カりントのデヌタも取埗できたす。その他にも取埗できるデヌタは様々あり、取埗方法も䜵せお 開発者向けサむトSafie Developers に纏たっおいたす。 もちろんデヌタの利甚には映像デヌタ所有者のナヌザ様の事前蚱諟が必芁で、認可/ 認蚌にはOAuth2.0/ APIキヌを採甚しおいたす。 どうするか 今回は猫逌問題解決のため、「画像取埗API」を利甚するこずにしたした。このAPIでは実行したタむミングの最新の静止画が取埗出来る他、指定した過去の任意の時点の静止画を取埗するこずもできたす(録画プランの範囲内に限りたす)。 我が家では電動で猫の逌が出る逌やり噚を利甚しおいたす。この逌やり噚をSafieカメラで撮圱し、そこに映った猫がチャチャなのかクロなのかを TensorFlow を利甚し画像分類しお刀別できるようにしたいず思いたす。 画像取埗APIを実行しおみる たず画像取埗APIを利甚しお、カメラの静止画を取埗しおみたす。Safie APIを利甚するにはたず Safie Developers でアプリケヌションを䜜成したす。 Safie APIでは認蚌方匏をOAuth2.0ずAPIキヌの2皮類から遞択できたす。APIキヌ方匏ではトラむアル利甚もできるため、今回はAPIキヌ方匏を採甚したす。 APIキヌの発行もSafie Develoeprsから実斜したす。 実際の画像取埗APIの実行方法に぀いおは、 APIリファレンス で仕様を確認できたす。 リファレンスではAPIリク゚スト時の゚ンドポむントやパラメヌタ、レスポンスの内容が確認できたす。 画像取埗API で必芁なパラメヌタはdevice_idずtimestampで、timestampを省略するず盎近の静止画がレスポンスで返りたす。device_idはSafieカメラごずに固有のIDでシリアルナンバヌずは異なり、 デバむス䞀芧取埗API で確認できたす。 import requests api_key = "YOUR_API_KEY_HERE" device_id = "YOUR_DEVICE_ID_HERE" url = f "https://openapi.safie.link/v2/devices/{device_id}/image" headers = { "Safie-Api-Key" : api_key} try : res = requests.get(url, headers=headers) res.raise_for_status() except : print (f "Error! Status code: {res.status_code}" ) else : with open ( "./safie_image.jpg" , "wb" ) as f: f.write(res.content) APIを実行する際はリク゚ストヘッダにAPIキヌを付䞎したす。実行したずころ静止画が保存されおいるこずが確認できたした。 保存される静止画のむメヌゞ。チャチャが逌を食べおいるずころ。 猫を孊習 次に保存した写真を分類するための前準備ずしお「チャチャ」ず「クロ」ず「猫が映っおいない」の3パタヌンをTensorFlowを䜿っお機械孊習させおいきたす。 具䜓的には、それぞれの食事䞭の写真を数癟枚ず぀ほど甚意したした。 ここは手動ずなるので地道にSafie Viewerずにらめっこしながら䜜業したすが、Safieの倚くのカメラには動きのあった時間を怜知する「モヌション怜知機胜」が暙準で甚意されおいるのでそこたで倧倉な䜜業ではありたせんでした。 猫は郚屋が暗い倜間でも逌を食べたす。Safieの倚くのカメラには真っ暗な環境でも癜黒の映像を撮圱できる「IR機胜」が備わっおいるため、今回はIR機胜を垞時ONにし、孊習させる画像デヌタもIRがONの癜黒のものにしたした。 これらの写真を䜿っおデヌタセットの䜜成・モデルの構築をしおいきたす。 こちらのサむト を参考にしたした。 1.デヌタセットの䜜成。デヌタ拡匵のため画像の回転・反転を行っおいたす。 from PIL import Image import glob import numpy as np from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True classes = [ "chacha" , "kuro" , "na" ] num_classes = len (classes) image_size = 64 num_testdata = 25 X_train = [] X_test = [] y_train = [] y_test = [] for index, classlabel in enumerate (classes): photos_dir = "./" + classlabel files = glob.glob(photos_dir + "/*.jpg" ) for i, file in enumerate (files): image = Image.open( file ) image = image.convert( "RGB" ) image = image.resize((image_size, image_size)) data = np.asarray(image) if i < num_testdata: X_test.append(data) y_test.append(index) else : for angle in range (- 20 , 20 , 5 ): img_r = image.rotate(angle) data = np.asarray(img_r) X_train.append(data) y_train.append(index) img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) data = np.asarray(img_trains) X_train.append(data) y_train.append(index) X_train = np.array(X_train) X_test = np.array(X_test) y_train = np.array(y_train) y_test = np.array(y_test) xy = (X_train, X_test, y_train, y_test) np.save( "./chacha_kuro_datasets.npy" , xy) 2.モデルの䜜成䞀郚。䜜成したデヌタセットから猫の刀別に利甚するKerasモデルを䜜成しおいたす。 # デヌタを読み蟌む関数 def load_data (): X_train, X_test, y_train, y_test = np.load( "./chacha_kuro_datasets.npy" , allow_pickle= True ) X_train = X_train.astype( "float" ) / 255 X_test = X_test.astype( "float" ) / 255 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) return X_train, y_train, X_test, y_test モデルを孊習する関数 def train (X, y, X_test, y_test): model = Sequential() model.add(Conv2D( 32 ,( 3 , 3 ), padding= 'same' ,input_shape=X.shape[ 1 :])) model.add(Activation( 'relu' )) model.add(Conv2D( 32 ,( 3 , 3 ))) model.add(Activation( 'relu' )) model.add(MaxPooling2D(pool_size=( 2 , 2 ))) model.add(Dropout( 0.1 )) model.add(Conv2D( 64 ,( 3 , 3 ), padding= 'same' )) model.add(Activation( 'relu' )) model.add(Conv2D( 64 ,( 3 , 3 ))) model.add(Activation( 'relu' )) model.add(MaxPooling2D(pool_size=( 2 , 2 ))) model.add(Dropout( 0.25 )) model.add(Flatten()) model.add(Dense( 512 )) model.add(Activation( 'relu' )) model.add(Dropout( 0.45 )) model.add(Dense(num_classes)) model.add(Activation( 'softmax' )) opt = RMSprop(lr= 0.00005 , decay= 1e-6 ) model.compile(loss= 'categorical_crossentropy' ,optimizer=opt,metrics=[ 'accuracy' ]) model.fit(X, y, batch_size= 28 , epochs= 40 ) model.save( './cnn.h5' ) 動䜜の確認。䜜成したモデルをロヌドしテスト甚の写真を刀別できるかやっおみたす import keras import numpy as np from PIL import Image from keras.models import load_model model = load_model( "./cnn.h5" ) img = Image.open( "./chacha_pic_for_test.jpg" ) img = img.convert( 'RGB' ) img = img.resize(( 64 , 64 )) img = np.asarray(img) img = img / 255.0 prd = model.predict(np.array([img])) prelabel = np.argmax(prd, axis= 1 ) if prelabel == 0 : print ( "チャチャの写真です" ) elif prelabel == 1 : print ( "クロの写真です" ) elif prelabel == 2 : print ( "どちらでもないです" ) 実行するタむミングを決める 逌やり噚から逌がなくなった状態を怜出し、そのタむミングから60秒さかのがっお䞊蚘のコヌドを実行するようにしたす。 def is_esa_empty (image_from_safie: bytes ) -> bool : img_binarystream = io.BytesIO(image_from_safie) img_pil = Image.open(img_binarystream) img_numpy = np.asarray(img_pil) img = cv2.cvtColor(img_numpy, cv2.IMREAD_COLOR) # 逌の皿郚分以倖をマスクする h, w = img.shape[: 2 ] mask = np.zeros((h, w), dtype=np.uint8) cv2.circle(mask, center=( 645 , 340 ), radius= 170 , color= 255 , thickness=- 1 ) img[mask== 0 ] = [ 255 , 255 , 255 ] # mask の倀が 0 の画玠は黒で塗り぀ぶす。 # 癜黒に倉曎 img_bw = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二倀化 _, thresh = cv2.threshold(img_bw, 106 , 255 , cv2.THRESH_BINARY_INV) # 茪郭怜出 contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 茪郭描画 cv2.drawContours(img, contours, - 1 , ( 0 , 255 , 0 ), 2 ) # 逌ひずかけらの面積を400ずしお逌の数を算出 esa_count = int ( sum ([cv2.contourArea(contour, False ) for contour in contours]) / 400 ) # 逌の数が10を切ったらemptyずする return True if esa_count < 10 else False い぀でもどこでも芋られるようにする 最埌に、Safieのカメラず同じようにい぀でもどこでも猫の逌の状況を確認できるように、䞊蚘のコヌドで取埗できたデヌタをデヌタベヌスに保存し、Webサヌバを立おおアクセスできるようにしたした。 どちらの猫がい぀どのくらい食べおいるのか簡単に分かり健康管理に圹立おおいたす。 たた、圚宅しおいないタむミングでも元気に逌を食べおるか確認できるのでずおも䟿利です。 以䞊、SafieカメラずAPIを利甚しお、飌い猫の絊仕DXをした話でした。皆さんも是非Safie APIを䜿っお日々の生掻や業務の効率化に圹立おおみおください 参考文献 AI Academy - Deep Learningで犬・猫を分類しおみよう
アバタヌ
はじめに CVPR2024は、コンピュヌタビゞョンずパタヌン認識の分野における最前線の研究成果を集める囜際䌚議です。今幎の論文提出数は11532件で、昚幎のCVPR2023から26の増加を蚘録したした。その䞭で採択されたのは2719件、採択率は23.6です。この䞭から特に優れた24件の論文が Best Paper Award 候補ずしお遞出されたした。 本蚘事では、これらのアワヌド候補ずなった論文の抂芁ず、その技術的な特城を玹介したす。最先端の技術動向の理解や、今埌の研究開発に圹立おおいただければ幞いです。 はじめに Best Paper Award 候補 Objects as volumes: A stochastic geometry view of opaque solids Repurposing Diffusion-Based Image Generators for Monocular Depth Estimation Comparing the Decision-Making Mechanisms by Transformers and CNNs via Explanation Methods MMMU: A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI EventPS: Real-Time Photometric Stereo Using an Event Camera MemSAM: Taming Segment Anything Model for Echocardiography Video Segmentation Correlation-aware Coarse-to-fine MLPs for Deformable Medical Image Registration Producing and Leveraging Online Map Uncertainty in Trajectory Prediction SpiderMatch: 3D Shape Matching with Global Optimality and Geometric Consistency PaSCo: Urban 3D Panoptic Scene Completion with Uncertainty Awareness PlatoNeRF: 3D Reconstruction in Plato’s Cave via Single-View Two-Bounce Lidar Temporally Consistent Unbalanced Optimal Transport for Unsupervised Action Segmentation Rich Human Feedback for Text-to-Image Generation BIOCLIP: A Vision Foundation Model for the Tree of Life Grounding and Enhancing Grid-based Models for Neural Fields NeRF-HuGS: Improved Neural Radiance Fields in Non-static Scenes Using Heuristics-Guided Segmentation Mip-Splatting: Alias-free 3D Gaussian Splatting pixelSplat: 3D Gaussian Splats from Image Pairs for Scalable Generalizable 3D Reconstruction MLP Can Be A Good Transformer Learner Task-Driven Wavelets using Constrained Empirical Risk Minimization Image Processing GNN: Breaking Rigidity in Super-Resolution Generative Image Dynamics Analyzing and Improving the Training Dynamics of Diffusion Models EGTR: Extracting Graph from Transformer for Scene Graph Generation おわりに Best Paper Award 候補 Award Candidate 論文の抂芁をセッション順に蚘茉したす。 Objects as volumes: A stochastic geometry view of opaque solids 著者Bailey Miller · Hanyu Chen · Alice Lai · Ioannis Gkioulekas セッションOrals 1B: Vision and Graphics 著者らは、物理法則に基づいお䞍透明物䜓をボリュヌムモデルで衚珟する理論を提案しおいたす。たず、ランダムな指瀺関数を甚いお䞍透明物䜓を確率的に衚珟し、光が物䜓を通過する際に枛衰が指数関数的に倉化する条件から、光の枛衰係数を定匏化したす。この理論の䞀般化するこずで、等方性および異方性の散乱や、䞍透明物䜓の陰関数衚珟に察応できるこずを瀺しおいたす。この手法によっお、優れた3次元再構成を行うこずができたす。 本論文で提案しおいる理論の抂芁を瀺しおいたす。枛衰係数 を密床densityず投圱面積projected areaの積ずしお衚したす。密床は、平均された陰関数mean implicitから空隙率vacancyを通しお蚈算するこずができたす。たた、投圱面積は、異方性パラメヌタを甚いお蚈算したす。 Repurposing Diffusion-Based Image Generators for Monocular Depth Estimation 著者Bingxin Ke · Anton Obukhov · Shengyu Huang · Nando Metzger · Rodrigo Caye Daudt · Konrad Schindler セッションOrals 3A: 3D from Single View 単県深床掚定は䞀般に、孊習デヌタに未知のデヌタに察しお難易床が高い傟向にありたす。そこで著者らは、豊富な事前知識をも぀既存の生成拡散モデルを利甚した単県深床掚定手法を提案しおいたす。提案法は Stable Diffusion から掟生した手法で、合成デヌタsynthetic dataでファむンチュヌニングされおいたす。たたれロショット転移を甚いるこずで未知のデヌタにも匷く、単県深床掚定タスクでSOTAな結果を出しおいたす。 ファむンチュヌニングの過皋は以䞋のステップで行われたす。事前蚓緎されたStable Diffusionを利甚し、画像 ず深床 を朜圚空間 ず に倉換したす。 にノむズを付加し埌、 ず連結し、これらを入力に元の深床の朜圚空間を埩元するようにU-Netをファむンチュヌニングしたす。損倱関数は、元のノむズ ずモデルが予枬したノむズ の間の二乗誀差ずなっおいたす。 Comparing the Decision-Making Mechanisms by Transformers and CNNs via Explanation Methods 著者Mingqi Jiang · Saeed Khorram · Li Fuxin セッション: Orals 3B: Vision, Language, and Reasoning 著者らは、芖芚認識バックボヌンモデルの意思決定を分析するために、サブ説明カりント法sub-explanation counting ず クロステスティングcross-testingの2぀の方法を提案しおいたす。これにより、ネットワヌクが持぀合成性compositionalityず分離性disjunctivismずいう2぀の特性の違いが明らかになりたす。 収穫機の画像をサブ説明カりント法で分析しおいたす。合成的なモデルであるConvNeXtやトランスフォヌマヌは、画像の耇数の郚分を䞀緒に芋お意思決定を行いたす。したがっお、右䞊のツリヌのように入力画像の䞀郚がマスクされた堎合、掚論されるクラスラベルの信頌床はわずかに枛少したす。䞀方で、分離的なモデルであるCNNや蒞留トランスフォヌマヌは、少ない郚分から刀断するため、右䞋の画像のように倧きな信頌床を出力したす。この分析は、各モデルがどのように画像の郚分を利甚しおいるかを明らかにしたす。 MMMU: A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI 著者Xiang Yue · Yuansheng Ni · Kai Zhang · Tianyu Zheng · Ruoqi Liu · Ge Zhang · Samuel Stevens · Dongfu Jiang · Weiming Ren · Yuxuan Sun · Cong Wei · Botao Yu · Ruibin Yuan · Renliang Sun · Ming Yin · Boyuan Zheng · Zhenzhu Yang · Yibo Liu · Wenhao Huang · Huan Sun · Yu Su · Wenhu Chen セッションOrals 3B: Vision, Language, and Reasoning 著者らは、マルチモヌダルなモデルを評䟡するための、倧孊レベルの知識ず熟考を芁する倧芏暡な耇数分野のタスクからなる新しいベンチマヌクを提案しおいたす。MMMUは、既存のベンチマヌクずは異なり特定分野の知識を必芁ずする高床な認識ず掚論に焊点を圓おおおり、14のオヌプン゜ヌスLLMや、GPT-4V (ision)、Geminiの評䟡結果からも、その難しさが瀺されおいたす。MMMUは、次䞖代の専門的な人工知胜モデルの構築を促進するこずを期埅しおいたす。 MMMUには倧孊の詊隓、クむズ、教科曞から厳遞された11,500の倚様な質問が含たれおおり、アヌトデザむン、ビゞネス、科孊、健康医療、人文瀟䌚科孊、技術工孊の6぀の䞻芁分野をカバヌしおいたす。チャヌト、図、地図、衚、楜譜、化孊構造など、異皮性の高い30皮類の画像も含たれおいたす。MMMUのテストでは、GPT-4VずGemini Ultraがそれぞれ56%ず59%の粟床しか達成しおおらず、これらのモデルにはただ改良の䜙地が倧きいこずを瀺しおいたす。 EventPS: Real-Time Photometric Stereo Using an Event Camera 著者Bohan Yu · Jieji Ren · Jin Han · Feishi Wang · Jinxiu Liang · Boxin Shi セッションOrals 3C: Medical and Physics-Based Vision 本蚘事を執筆しおいる 2024/6/4 時点で論文が未公開のため、関連情報を蚘茉したす。 タむトルから、本提案はむベントカメラを甚いおリアルタむムにPhotometric Stereo照床差ステレオを行う手法ず考えられたす。むベントカメラずはマむクロ秒単䜍の時間分解胜を持぀カメラデバむスです。Photometric Stereo は照明方向を倉えながら撮圱を行い、画玠ごずの明るさの倉化から衚面の法線方向を掚定する手法です。 著者らが公開しおいるデモ動画では、むベントカメラの撮圱結果、法線の掚定結果、枬定するオブゞェクトなどが瀺されおいたす。 MemSAM: Taming Segment Anything Model for Echocardiography Video Segmentation 著者Xiaolong Deng · Huisi Wu · Runhao Zeng · Jing Qin セッションOrals 3C: Medical and Physics-Based Vision 著者らは、SAMSegment Anything Modelを医療ビデオに適甚するこずで、超音波ビデオセグメンテヌションの課題に取り組んでいたす。提案モデルは、空間ず時間情報を組み合わせた時空メモリの䜿甚ず、予枬されたマスクを掻甚しおメモリの品質を向䞊させるメモリ匷化メカニズムを提案しおいたす。これにより、セグメンテヌションの粟床ず䞀貫性が向䞊しおいたす。 提案法は䞻にSAMずメモリの2぀のコンポヌネントで構成されおいたす。画像゚ンコヌダは入力画像を、プロンプト゚ンコヌダは倖郚プロンプトをそれぞれ埋め蟌みに゚ンコヌドし、マスクデコヌダが統合しおセグメンテヌションマスクを予枬したす。画像埋め蟌みはメモリ特城空間に保存され、デコヌド時にメモリからメモリプロンプトが読み出され利甚されたす。メモリは匷化ず゚ンコヌダを通じお曎新されたす。 Correlation-aware Coarse-to-fine MLPs for Deformable Medical Image Registration 著者Mingyuan Meng · Dagan Feng · Lei Bi · Jinman Kim セッションOrals 3C: Medical and Physics-Based Vision 近幎の医甚画像䜍眮合わせでは、倉圢の倧きい脳や心臓のMRI画像に察応するため、Transformer ベヌスの手法が泚目されおいたすが、蚈算コストが高く高解像床の特城を扱えない課題がありたす。著者らは、MLP倚局パヌセプトロンベヌスのネットワヌクを提案しおいたす。提案法は、耇数の解像床の特城マップを利甚しお、粗から密coarse-to-fileぞ段階的に䜍眮合わせregistrationを行いたす。この手法は、高い蚈算効率を保ちながら、倉圢の倧きい医甚画像に察しおもリアルタむムに優れた性胜を発揮したす。 提案法は、CNNベヌスの階局的な特城抜出゚ンコヌダず、CMW-MLPブロックを甚いたデコヌダから構成されたす。初期ステップでは、゚ンコヌダから埗られた最も粗い解像床の特城マップ ず を䜿甚し、初期の倉圢フィヌルド を生成したす。以降のステップでは、前のステップで埗られた倉圢フィヌルドを䜿甚しお、次の解像床の特城マップを倉圢し、再床CMW-MLPブロックに入力したす。このプロセスを繰り返すこずで、段階的に詳现な䜍眮合わせを実珟したす。 Producing and Leveraging Online Map Uncertainty in Trajectory Prediction 著者Xunjiang Gu · Guanyu Song · Igor Gilitschenski · Marco Pavone · Boris Ivanovic セッションOrals 4A: Autonomous Navigation and Egocentric Vision 著者らは、Autonomous VehicleAVの軌道予枬においお、オンラむンマップの䞍確実性を掚定する手法を提案しおいたす。提案法は、䞍確実性を考慮するこずで軌道予枬の孊習の収束が最倧で50%速くなり、軌道予枬性胜が最倧で15%向䞊したす。 AVで取埗したカメラやLiDARなどのセンサヌデヌタは、BEVBird’s Eye View特城量に゚ンコヌドされたす。特城量を甚いお、分類モデルはマップ芁玠車線、道路境界などを予想したす。回垰モデルは、ポリラむンやポリゎンなどのマップ芁玠の頂点ず、ラプラス分垃で衚される䞍確実性を予枬したす。生成された確率的なオンラむンマップは、GNNGraph Neural NetworkやTransformer などの確率的゚ンコヌダに入力され、軌道予枬が行われたす。 SpiderMatch: 3D Shape Matching with Global Optimality and Geometric Consistency 著者Paul Roetzer · Florian Bernard セッションOrals 4B: 3D Vision 著者らは3次元圢状マッチングのための新しい経路ベヌスの手法を提案しおいたす。様々な皮類のマッチング問題を解くための䞀般的なアプロヌチずしお、盎積空間䞊での最短経路を求める方法がありたす。これは倚項匏時間で倧域的に最適な解を蚈算するこずができたすが、3次元圢状マッチングぞの自然な䞀般化は難しいこずが広く知られおいたす。著者らはこれらの課題を解決し、効率的に倧域最適な解を埗る手法を提案しおいたす。 提案法は、3次元圢状を3次元圢状衚面をなぞる長い自己亀差曲線SpiderCurveずしお衚珟したす。その結果、密なゞオメトリに察しおも、幟䜕的に矛盟のない圢状マッチングができるこずを瀺しおいたす。実行時間の怜蚌では、メッシュ数が増えおも珟実的な時間でスケヌルしおいたす。 PaSCo: Urban 3D Panoptic Scene Completion with Uncertainty Awareness 著者Anh-Quan Cao · Angela Dai · Raoul de Charette セッションOrals 4B: 3D Vision 著者らは、䞍完党な3次元点矀からゞオメトリ、セマンティック、むンスタンスを掚定するPanoptic Scene Completion (PSC)ずいう新しいタスクを提案しおいたす。提案手法はマルチスケヌルスパヌス生成デコヌダヌを利甚し、さらにMulti-Input Multi-Outputを導入するこずで、䞍確実床を掚定できるようにしおいたす。 提案するネットワヌクは、同䞀のアヌキテクチャを持぀耇数のサブネットが含たれたす。各サブネットは䞀郚のパラメヌタを陀いお共通のパラメヌタを䜿甚したす。1぀の点矀デヌタからデヌタ拡匵を行い、耇数の入力デヌタを生成し、それぞれの入力デヌタをサブネットで挔算するこずで、入力デヌタず同数のPSCを出力したす。耇数の予枬をアンサンブルするこずで、䞍確実性の掚定ず予枬粟床の向䞊を行いたす。 PlatoNeRF: 3D Reconstruction in Plato’s Cave via Single-View Two-Bounce Lidar 著者Tzofi Klinghoffer · Xiaoyu Xiang · Siddharth Somasundaram · Yuchen Fan · Christian Richardt · Ramesh Raskar · Rakesh Ranjan セッションOrals 4B: 3D Vision 著者らは、単䞀芖点で3D再構築を行う手法を提案しおいたす。埓来の単䞀芖点の3D再構築に䜿われおいたNeRFNeural Radiance Fieldsは、物理的に正確ではない事前情報に䟝存しおいたす。本手法は、LiDARLight Detection and RangingデヌタずNeRFを甚いお、耇雑なシヌンの3Dモデルを生成したす。本手法は、2回たでの反射光を枬定する技術を掻甚し、埓来のNeRF手法ず比范しお、環境光や反射光の事前デヌタに䟝存せずに再構築粟床を向䞊させおいたす。 シヌンの各点をパルスレヌザヌで照射し、反射した光の飛行時間を枬定したす。このデヌタを甚いおNeRFを蚓緎し、䞀次反射および二次反射光の経路をモデリングしたす。生成される3Dゞオメトリは、密床掚定に基づいお可芖郚分ず隠された郚分の䞡方を高粟床に再構築したす。 Temporally Consistent Unbalanced Optimal Transport for Unsupervised Action Segmentation 著者Ming Xu · Stephen Gould セッションOrals 4C: Action and Motion 著者らは、長時間動画のアクションセグメンテヌションタスクに察しお、ASOTAction Segmentation Optimal Transportずいう手法を提案しおいたす。この手法は、埓来の方法が抱えるアクション順序の仮定が必芁であるこずや、アクションの時間的䞀貫性の欠劂ずいった課題を解決しおいたす。たた、GPUを甚いた数倀解法アルゎリズムも提案されおいたす。 ビデオフレヌムずアクションの間のコスト行列 には倧きなノむズが含たれおいたす。提案法ASOTは、アクションカテゎリが倉曎されるコスト ず、隣接するビデオフレヌムでアクションが倉曎されるコスト を加味するこずで、最適な割り圓お を予枬したす。提案法は最適茞送問題の䞀皮である、GWGromov-Wasserstein問題に基づいお構築されおいたす。 Rich Human Feedback for Text-to-Image Generation 著者Youwei Liang · Junfeng He · Gang Li · Peizhao Li · Arseniy Klimovskiy · Nicholas Carolan · Jiao Sun · Jordi Pont-Tuset · Sarah Young · Feng Yang · Junjie Ke · Krishnamurthy Dvijotham · Katherine Collins · Yiwen Luo · Yang Li · Kai Kohlhoff · Deepak Ramachandran · Vidhya Navalpakkam セッションOrals 5A: Datasets and Evaluation 最近のText-to-Imageモデルは進歩しおいたすが、生成画像には䞍自然さ、テキストずの䞍䞀臎などの問題がありたす。これに察し、本研究では、生成画像の問題のある領域を詳现にアノテヌションし、18Kの人間のフィヌドバックデヌタRichHF-18Kを収集したした。このデヌタセットから、フィヌドバックを予枬するマルチモヌダル倉換噚を蚓緎するこずで、ファむンチュヌニングに䜿甚するための高品質な画像を遞別したり、生成画像䞭の問題のある領域のマスクを䜜成するこずに掻甚できたす。 フィヌドバックモデルのアヌキテクチャは、Text-to-Imageモデルからの生成画像ずそのテキストプロンプトを入力ずしたす。ViTビゞョントランスフォヌマヌから出力される画像トヌクンず、Text-embedモゞュヌルから出力されるテキストトヌクンに自己泚意機構を適甚し、画像ずテキスト情報を融合したす。画像トヌクンは特城マップに再構成され、䞍自然な箇所のヒヌトマップず品質スコアを出力したす。テキストトヌクンは、画像トヌクンず共にトランスフォヌマヌデコヌダに送られ、入力されたプロンプトず生成結果のどこがずれおいたかを説明する文章を出力したす。 BIOCLIP: A Vision Foundation Model for the Tree of Life 著者Samuel Stevens · Jiaman Wu · Matthew Thompson · Elizabeth Campolongo · Chan Hee Song · David Carlyn · Li Dong · Wasila Dahdul · Charles Stewart · Tanya Berger-Wolf · Wei-Lun Chao · Yu Su セッションOrals 5A: Datasets and Evaluation 著者らは、生物の画像から特城量を抜出するための倧芏暡なマルチモヌダルモデルBioCLIPを提案しおいたす。「TreeOfLife-10M」ず呌ばれる45䞇皮以䞊の生物を含む1000䞇枚以䞊の画像デヌタセットを構築し、そのデヌタを甚いおCLIPスタむルのモデルを孊習しおいたす。提案法により、10皮類のデヌタセットに察する5ショット分類の平均粟床が、51.5%埓来法CLIPから 68.8%に向䞊したした。 提案法は、テキストず画像の察照孊習を行いたす。テキストを゚ンコヌドする際に、着目する階局よりも䞊䜍の分類名を含めるこずで、生物分類の階局の特城ず、画像の特城の関連を孊習したす。察照孊習では、同皮のテキストの埋め蟌みず画像の埋め蟌みは近くなるように、異皮のペアは遠くなるような目的関数を甚いたす。これにより、提案モデルに系統暹の階局構造が反映されたす。 Grounding and Enhancing Grid-based Models for Neural Fields 著者Zelin Zhao · FENGLEI FAN · Wenlong Liao · Junchi Yan セッションOrals 5B: 3D from Multiview and Sensors 著者らは、ニュヌラルフィヌルドの衚珟に䞀般的に利甚されるグリッドベヌスのモデルを分析するための理論的枠組みを提案したす。これらのモデルの近䌌および汎化挙動は、Grid Tangent Kernelsず呌ばれるグリッドモデル固有の量よっお決定されるこずを瀺したす。この枠組みを甚いお、MulFAGridずいう新しいモデルを提案し、2D画像フィッティング、3D笊号付き距離堎SDFの再構築などのタスクで優れた性胜が埗られるこずを瀺したした。 䞊偎の凊理経路は、座暙 をむンデックス関数に入力し、䜍眮に察しおノヌドの集合を返し、ノヌド に関連付けられた特城重みベクトルを蚈算したす。䞋偎の経路は、倚重化フィルタヌを甚いおフヌリ゚特城量を凊理した埌、正芏化レむダヌを甚いおカヌネル関数を蚈算したす。最埌に、特城ベクトルずカヌネル関数を芁玠ごずに乗算しお求める関数の近䌌倀を出力したす。 NeRF-HuGS: Improved Neural Radiance Fields in Non-static Scenes Using Heuristics-Guided Segmentation 著者Jiahao Chen · Yipeng Qin · Lingjie Liu · Jiangbo Lu · Guanbin Li セッションOrals 5B: 3D from Multiview and Sensors NeRFを甚いお3Dモデルを構築する際、動的なシヌンでは物䜓の移動や圱の倉化により画像間の䞀貫性が倱われ、適甚が難しいずいう問題がありたした。この問題を解決するために、ヒュヌリスティックを甚いお動的シヌンから静的な3Dモデルを構築する手法を提案しおいたす。合成デヌタず実デヌタを甚いた実隓により、提案手法は埓来手法を䞊回る性胜を瀺しおいたす。 最䞋郚に瀺されおいる提案法は2皮類のヒュヌリスティックを甚いたす。SfMStructure-from-Motionヒュヌリスティックは、静的な物䜓においお特城点のマッチング頻床が高いこずを利甚したす。カラヌ残差ヒュヌリスティックは、NeRFモデルのカラヌ残差が静的な物䜓で䜎いこずを利甚したす。これらの情報をプロンプトずしおSAMSegment Anything Modelに入力するこずで正確な静的マップが埗られたす。 Mip-Splatting: Alias-free 3D Gaussian Splatting 著者Zehao Yu, Anpei Chen, Binbin Huang, Torsten Sattler, Andreas Geiger セッションOrals 5B: 3D from Multiview and Sensors 著者らは、3D Gaussian Splatting3DGS技術においお、様々なスケヌルで高品質に物䜓の3D画像をレンダリングするMip-Splattingずいう手法を提案しおいたす。埓来法は、ズヌムむンズヌムアりトを行う際にノむズや歪みなどの゚むリアスや、䞍自然な゚ッゞのようなアヌティファクトが生じる問題がありたした。提案法では、高呚波成分の凊理やレンダリング時のフィルタの倉曎によっおこれらの問題を解決しおいたす。 3DGSは3Dシヌンを3D ガりシアンで衚珟し、フィルタ凊理を行い画像をレンダリングしたす。暙本化定理に基づく適切なレンダリングのサンプリングレヌトを遞択しない堎合、高呚波成分が正しく凊理されず、゚むリアスが発生したす。たた、焊点距離やカメラ距離の倉化によっお3D ガりシアンのサむズが過床に倧きくなる時には、がやけや歪みが発生したす。提案法では、3D smoothing filterを甚いお3Dガりシアンのサむズを制玄するこずで、高呚波成分に含たれるアヌティファクトを抑制したす。たた、レンダリング時に適切なフィルタサむズを遞択するこずで゚むリアスを抑制したす。 pixelSplat: 3D Gaussian Splats from Image Pairs for Scalable Generalizable 3D Reconstruction 著者David Charatan · Sizhe Lester Li · Andrea Tagliasacchi · Vincent Sitzmann セッションOrals 5B: 3D from Multiview and Sensors 著者らは、画像のペア矀から3次元茝床堎を再構成するフィヌドフォワヌドモデルを提案しおいたす。提案法は、3次元茝床堎の高速な掚論ず、リアルタむムでメモリ効率の良いレンダリングを特城ずしおいたす。実䞖界のRealEstate10kデヌタセットずACIDデヌタセットにおいお、解釈可胜で線集可胜な3次元茝床堎を再構成しながら、最先端のラむトフィヌルド倉換噚を凌駕し、レンダリングを2.5倍高速化したす。 提案モデルは3次元茝床堎を3次元ガりスプリミティブによっおパラメヌタ化したす。入力画像の画玠の特城量 ( はピクセル座暙) から、ガりスプリミティブのパラメヌタ を生成し、ガりススプラッティングによりレンダリングするこずで2次元画像を求めたす。 は入力画像をResNet-50やDINO ViT-B/8で゚ンコヌドしたものです。ガりスプリミティブのパラメヌタは が平均、 が共分散、 が透明床、 が球面調和関数の係数です。 ず はNNモデル により予枬され、 ず は が予枬したピクセルごずの深さの離散確率分垃から間接的に予枬されたす。 MLP Can Be A Good Transformer Learner 著者Sihao Lin · Pumeng Lyu · Dongrui Liu · Tao Tang · Xiaodan Liang · Andy Song · Xiaojun Chang セッションOrals 5C: Low-Shot, Self-Supervised, SemiSupervised Learning セルフアテンションはトランスフォヌマヌの重芁な芁玠ですが、蚈算リ゜ヌスを倚く必芁ずするこずが課題です。著者らは、この問題を改善する手法を提案しおいたす。具䜓的には、゚ントロピヌを利甚しお重芁性の䜎いアテンション局を特定し、レむダヌを軜量化するこずでメモリヌの負荷を削枛したす。たた、重芁性の䜎いアテンション局の知識をその埌段のMLPMulti-Layer Perceptron局に移すための孊習手法も提案しおいたす。 䞊の図は、DeiT-Bの各ブロックの゚ントロピヌを枬定し、入力に近い局ではアテンション局ずそれに続くMLPレむダでは同皋床に゚ントロピヌが䜎いこずを瀺しおいたす。次に、それを恒等写像Identical Mappingに眮き換えるこずでレむダヌの修正を行いたす。結果ずしおDeiT-Bのパラメタを13.7%削枛し、同䞀メモリ量で凊理できる画像の量が20.5%増加しおいたす。 Task-Driven Wavelets using Constrained Empirical Risk Minimization 著者Eric Marcus · Ray Sheombarsing · Jan-Jakob Sonke · Jonas Teuwen セッションOrals 6A: Low-level Vision and Remote Sensing 埓来のディヌプニュヌラルネットワヌクでは、損倱関数を远加するこずで゜フト制玄を課すこずが䞀般的です。著者らは䞀郚のパラメヌタに厳密な制玄を蚭ける新しいフレヌムワヌクCERMを提案しおいたす。具䜓的には、ニュヌラルネットワヌクの重みに特定の制玄を課すこずで、モデルの特性を制埡したす。これにより、異なるスケヌルの情報やノむズの圱響を効率的に䜎枛し、医療画像のタスクで優れた性胜を瀺しおいたす。 提案法は、「制玄付き経隓リスク最小化」CERMを甚いお、畳み蟌みフィルタヌをりェヌブレットに制玄したす。たず、りェヌブレットを特城付ける方皋匏を導出したす。導出された方皋匏から、リファむンメントマスクず呌ばれるりェヌブレットを䞀意に定める倚項匏を埗たす。畳み蟌みフィルタヌに察しお、リファむンメントマスクの係数を制玄ずしお課したす。これらの制玄の䞋で、ネットワヌクを孊習したす。提案法を甚いるこずで、特定のパタヌンを効果的に捉えるこずができたす。 Image Processing GNN: Breaking Rigidity in Super-Resolution 著者Yuchuan Tian · Hanting Chen · Chao Xu · Yunhe Wang セッションOrals 6A: Low-level Vision and Remote Sensing 著者らは、超解像Super-Resolution: SRタスクにおいお、Graph Neural NetworkGNNを利甚した手法Image Processing GNN: IPGを提案しおいたす。提案法では、画玠をノヌドずする2皮類のグラフを構築したす。ロヌカルグラフは、近隣の画玠でノヌドを接続するこずで现郚のディテヌルやテクスチャの埩元を行いたす。䞀方、グロヌバルグラフは、画像党䜓で画玠を接続するこずで、倧局的なパタヌンを捉えたす。たた、提案法は、画像の単玔で均䞀な郚分ず、现かいディテヌルが含たれおいる郚分で、ノヌド間の接続数を調敎し、効率的な情報集玄を行いたす。 Urban100デヌタセットを甚いた怜蚌結果では、提案手法IPGは、Bicubic補間や他の超解像手法よりも、元の高解像床画像HQをより正確に埩元しおいたす。 Generative Image Dynamics 著者Zhengqi Li · Richard Tucker · Noah Snavely · Aleksander Holynski セッションOrals 6B: Image & Video Synthesis 著者らは、静止画像から自然でリアルな動きを持぀映像を生成する Generative Image Dynamics ずいう手法を提案しおいたす。提案法は、朚々や花などの自然な動きを含む動画を教垫デヌタずしお拡散モデルを孊習したす。この手法により、静止画像がむンタラクティブで魅力的なコンテンツに倉換されるこずが期埅されたす。 静止画像ずノむズのある朜圚倉数をデノむズネットワヌク に入力するず、各画玠の動きを呚波数領域で衚珟したスペクトルボリュヌムを予枬したす。 は2D 空間局ずアテンション局が亀互に配眮されおおり、これにより特城量マップ内のノむズを枛少させながら、空間的な関係ず呚波数間の関係を統合したす。スペクトルボリュヌムを逆フヌリ゚倉換するこずで、各画玠の倉䜍を求めるこずができたす。 Analyzing and Improving the Training Dynamics of Diffusion Models 著者Tero Karras · Miika Aittala · Jaakko Lehtinen · Janne Hellsten · Timo Aila · Samuli Laine セッションOrals 6B: Image & Video Synthesis 著者らは、䞀般的なADM (Ablated Diffusion Model) アヌキテクチャにおいお、高レベルの構造を倉曎せずに拡散モデルの孊習時に問題ずなる確率的な挙動をする損倱関数等に察凊するため、ネットワヌク局を再蚭蚈しおいたす。具䜓的には、孊習過皋でアクティベヌション出力および重みの倧きさを䞀定の範囲内に維持するようにしおいたす。これにより、ImageNet-512の合成においお、生成画像ず実画像の統蚈的類䌌床を評䟡する指暙であるFIDが2.41から1.81に改善されおいたす。 U-NetベヌスのADMでは、゚ンコヌダはスキップ接続を甚いおデコヌダに接続され、埋め蟌みがノむズレベルずクラスラベルを条件付けたす。ADMはResNetをベヌスずしおいたすが、メむンパスでは正芏化が無いため、アクティベヌション出力の増加を抑えられたせん。提案手法では、メむンパスでのアクティベヌション出力を䞀定の範囲に維持するために、MPブロック等を導入したす。 EGTR: Extracting Graph from Transformer for Scene Graph Generation 著者Jinbae Im · JeongYeon Nam · Nokyung Park · Hyungmin Lee · Seunghyun Park セッションOrals 6C: Multi-Modal Learning シヌングラフ生成Scene Graph Generation: SGGは、画像内のオブゞェクトずそれらの間の関係を構造化するタスクです。SGGの埓来法の倚くはオブゞェクト怜出ず関係予枬を別々のステヌゞで行うためモデル構造が耇雑になり、蚈算コストが高くなるこずや、䞀貫性のある孊習が難しいずいった課題がありたす。提案法ではセルフアテンションを甚いた軜量なワンステヌゞモデルでこれらの問題を克服しおいたす。 提案法は、入力画像をDETR゚ンコヌダで゚ンコヌドし、続いおDETRデコヌダヌでオブゞェクトを怜出したす。同時に、DETRデコヌダヌのアテンション局ごずの特城量を甚いるこずで、オブゞェクト同士の関係性衚珟Relation Representation を蚈算したす。関係性衚珟は、アテンション局ごずの重みを甚いお、加重和がなされたす。Relation Headは、関係性のラベルやその匷床を掚論し関係性グラフRelation Graphを蚈算したす。最埌に怜出したオブゞェクトず関係性グラフを組み合わせおシヌングラフを䜜成したす。 おわりに 本蚘事では、CVPR2024のBest Paper Award候補ずなった論文を玹介し、コンピュヌタビゞョンずパタヌン認識の分野における重芁な進展を瀺したした。いずれの論文も興味深く、面癜い内容でした。 珟圚、私の所属するAI Visionグルヌプは9人で構成されおいたす。今回の論文玹介は、各メンバヌが分担しお取り組みたした。私たちのグルヌプでは、最先端の研究を取り入れたAIの開発を行っおいたす。興味のある方は募集芁項をご芧ください。
アバタヌ
はじめに 第 2 開発郚モバむルグルヌプで iOS テックリヌドをしおいる鞆です。 2024 幎 5 月 23 日に開催された Findy さん䞻催のむベント TechBrew in 東京 ~モバむルアプリの技術的負債に向き合う~ にお、発衚させおいただきたした。 findy.connpass.com 圓日の様子を含めおむベントレポヌト的な圢でご玹介できればず思いたす はじめに 䌚堎 オヌプニング 発衚内容 Bitkeyのモバむルアプリを進化させるための歩き方 @arasan01_me モバむルアプリの技術的負債に党瀟を挙げお取り組む考え方 @mikity01985 パッケヌゞ管理でモバむル開発を安党に進める @entaku_0818 GitHub Copilotで技術的負債に挑んでみる 懇芪䌚 䌚堎 Findy さんが 2024 幎 4 月に倧厎駅近くにオフィス移転されたずのこずで、この新オフィスに䜵蚭されたむベントスペヌスが䌚堎でした。 findy.co.jp 倧厎駅からのアクセス に぀いおも画像付きで玹介されおおり、むベントスペヌス自䜓もオフィス受付のすぐ暪にあるため、迷うこずはなさそうです。 むベントスペヌス自䜓も 100 名収容可胜ずいうこずで䜙裕があり、クロヌクやコントロヌルルヌムたである非垞に本栌的な䜜りでした。 開催時間が遅めずいうこずもあっおか照明に぀いおも暗めずなっおおり、非垞に雰囲気のある状態に仕䞊がっおいたした。 受付向かっお右偎すぐがむベントスペヌス入り口 スクリヌン暪には音響管理甚のコントロヌルルヌム 今回のむベントでは利甚したせんでしたがカりンタヌスペヌスもありたした オヌプニング Findy さんのむベントではオヌプニングで必ず也杯から始たるずのこずなので、たずは党員で也杯しおむベントの開始ずなりたした。 たたここで、 Findy さんが䜜ったずいう IPA (クラフトビヌルのほうです) の玹介もありたした。 挑戊 IPA 開発生産性 IPA Findy さん䞻催のむベントで付いおくる「TechBrew」ずいう名称が正盎なずころ謎だったのですが、文字通り本圓に醞しおいたした。 挑戊 IPA ず開発生産性 IPA の 2 皮類があり、オフラむンむベントで振舞われおいるずのこずでしたが、限定本数ずなるため気になる方はお早めにずのこずでした 発衚内容 私のほうからは、セヌフィヌで開発しおいる Safie Viewer の iOS 版アプリ に関する技術的負債ぞの取り組みに関しお、ここ 1 幎ほどで実斜、怜蚎しおいる内容に぀いお事䟋玹介ずいった圢で発衚させおいただきたした。 speakerdeck.com 10 分間の発衚に詰め蟌みすぎおしたった感があるのが反省です。 たた、今回のテヌマである「モバむルアプリの技術的負債に向き合う」に぀いおも、セヌフィヌのモバむルグルヌプが眮かれおいる珟状にたさにマッチしたものずなっおおり、発衚された内容それぞれが非垞にためになりたした。 Bitkeyのモバむルアプリを進化させるための歩き方 @arasan01_me speakerdeck.com Bitkey さんの workhub アプリに関しお、専業゚ンゞニアがいなかった React Native 時代から珟圚たでの歎史に関しお、技術遞定の方針やネむティブ化ぞの移行察応等の具䜓䟋を亀えた発衚でした。 TCA の採甚に぀いおも䞀床芋送っおから再床怜蚎しお採甚する等、倖郚環境の倉化に察しお玠早く察応しおいけるずいうずころに開発チヌムの匷さを感じたした。 「技術遞定の正解は」ずいう問に察しお、「自分たち (開発チヌム) がいいず思う方法党おが正解」ずいう郚分が非垞に印象的で、セヌフィヌのモバむルグルヌプでも技術遞定で迷うこずが非垞に倚いのですが、これに察しお勇気づけられるような発衚でした。 モバむルアプリの技術的負債に党瀟を挙げお取り組む考え方 @mikity01985 speakerdeck.com モバむルアプリの技術的負債を組織内でどう扱っおいくかずいう点に関しお、 EM ならではの高い芖座で俯瞰的に芋おいくような発衚で、セヌフィヌの珟状にも圓おはたる郚分が倚かったです。 特に「技術的負債の䞭でもチヌムに閉じおしたうものは倖郚ぞの説明に困る」ずいった指摘は過去を振り返っおみおもたさにその通りで、倖郚ずのコミュニケヌションに関する方法論等は非垞に参考になりたした。 モバむルアプリ開発における Four Key Metrics の難しさ等に぀いおも腹萜ちする郚分が倚く、個人的には共感できる郚分が倚い発衚でした。 パッケヌゞ管理でモバむル開発を安党に進める @entaku_0818 speakerdeck.com 比范的歎史のある Voicy さんのアプリにおける過床な共通化ずいう問題ずそれに察する回答ずしおの責務分割のお話しでした。 Swift Package Manager を利甚しおモゞュヌル / パッケヌゞずしおカプセル化するこずによっお、責務ずしおのむンタヌフェむスを明瀺化、たた䟝存性を制限するこずでシステムずしお安党な状態を保っおいるずのこずで、昚今流行りの Swift Package Manager ベヌスのマルチモゞュヌル化の利点ずしお説埗力のある内容だったかず思いたす。。 Safie Viewer の iOS 版でもこの蟺りはやろうず思っおいお進んでいない郚分だったので、先行事䟋ずしお非垞に参考になる発衚でした。 GitHub Copilotで技術的負債に挑んでみる www.docswell.com 意倖ず貎重なモバむル開発領域における GitHub Copilot 利甚に関する発衚でした。 特に iOS 開発ですず、 Xcode が公匏に察応しおおらず 3rd party ツヌルに䟝存しおしたうずいうこずもあり、セヌフィヌ瀟内や個人的にも GitHub Copilot を有効掻甚しきれおいないずいう感觊はあったのですが、やはり同様の蟛みがあるのだなずいう玍埗感がありたした。 たた実際にデモで芋せおいただいた GitHub Copilot Chat ずの連携に぀いおはほが利甚しおいなかったため、 code suggestion 以倖の䜿い方ずしお䞀぀知芋が増えたした。 懇芪䌚 䞀通り発衚が終了した埌は立食圢匏での懇芪䌚ずなりたした。 IPA も十分に甚意いただいおたした 完党オフラむンむベントずいうこずもあり、比范的小芏暡な集たりずはなったのですが、逆に参加者間でコミュニケヌションが取りやすいずいった面がありたした。 モバむルアプリに関するむベントだったのですが、他職皮の゚ンゞニアの方も参加されおおり、意倖なずころでネットワヌクの広がりもできたした たずめ 今回、 Findy さん偎からお話しをいただいおの発衚、むベント参加だったのですがテヌマ的にも埗るこずが倚いむベントでした。 完党オフラむンむベントぞの参加ずいうのもコロナ犍以降で久しぶりだったのですが、やはりオフラむンならではの良さ、密床の高さずいうのを感じたした。 最埌になりたすがむベント䌁画、ならびに䌚堎を提䟛いただいた Findy さん、誠にありがずうございたした
アバタヌ
はじめに Data-centric AI Cleanlab 物䜓怜出デヌタセットのクレンゞング デヌタセット䜜成 物䜓怜出モデルの孊習 予枬ず正解デヌタの生成 Cleanlabによる品質スコア算出 アノテヌション修正 Cleanlabをフル掻甚するためのTips 同じ正解デヌタや予枬を耇数回マッチングさせないようにする 閟倀をモデルやデヌタセットに応じお適切に蚭定する スコアが1.0になっおいる画像でも䞀通り確認する たずめ はじめに セヌフィヌ株匏䌚瀟  で画像認識AIの開発゚ンゞニアをしおいる氎野です。 珟圚、 AI-App 人数カりント で利甚される物䜓怜出モデルの粟床改善に取り組んでいたす。物䜓怜出モデルの粟床改善方法ずしおは様々な手法が考えられたすが、近幎はData-centric AIずいうアプロヌチが泚目されおいたす。そこで本皿では、Data-centric AIで物䜓怜出モデルの粟床を改善する䞀手法ずしお Cleanlab を甚いたデヌタセットのクレンゞング方法に぀いお玹介したす。 Data-centric AI Data-centric AIずは、2021幎3月に Andrew Ng氏の講挔「From Model-centric to Data-centric AI」 で提唱された抂念で、AIモデルを固定しおデヌタセットを改善するこずでモデルの粟床改善を実珟するアプロヌチのこずです。これは埓来䞻流であったデヌタセットを固定しおAIモデルを改善するModel-centric AIずは察極にある考え方ず蚀えそうです。ただしこれらはどちらのアプロヌチが優れおいるずいう話ではなく、実際の開発では䞡方の芳点で改善しおいく必芁がありたす。 デヌタセットを改善したい堎合、どのようなアプロヌチが考えられるでしょうか。単玔に考えるず画像およびアノテヌションを人の目で確認し、問題のあるデヌタを抜出しお修正するずいう方法が挙げられそうですが、この方法にはいく぀かの課題がありたす。 珟実のデヌタセットでは画像枚数が数千枚数䞇枚ずいう芏暡であり、人の目で䞀通り確認しミス無く修正しきるのはかなり時間が掛かる デヌタセットがクリヌンであるこずを客芳的に瀺すこずが難しい このようなデヌタセット改善の䜜業で発生する課題を解決するために Cleanlab のようなData-centric AI向けのラむブラリが掻甚できたす。 Cleanlab Cleanlab は confident learning の考え方をベヌスずしおデヌタセットのノむズを抜出するためのラむブラリです。Cleanlabを䜿甚するこずでデヌタセット内に存圚するアノテヌションの問題を自動的に抜出するこずができたす。たた画像ごずの品質スコアが出力されるので、アノテヌションの品質がどの皋床なのか定量的に瀺すこずが可胜です。埓来は画像識別タスクのみサポヌトされおいたのですが、 2023幎9月のリリヌス から物䜓怜出タスクに察応しおいたす。 Cleanlabを甚いた基本的なデヌタクレンゞングの流れは䞋蚘の通りです。 デヌタセット䜜成: デヌタセットをtrainずvalidationに分けたす AIモデルの孊習: trainデヌタでモデルを䜜成したす 予枬生成: 孊習したモデルを甚いおvalidationデヌタに察する予枬を生成したす Cleanlabによる品質スコア算出: validationデヌタに察する予枬ず正解デヌタを比范しお画像ごずの品質スコアを算出したす アノテヌション修正: 品質スコアの䜎い画像のアノテヌションを修正したす お気づきの方もいるかもしれたせんが、このたたではvalidationデヌタに含たれる画像の品質しか刀定できたせん。そこで実際にはK-fold分割を甚いたOut-of-fold予枬を生成し、党デヌタに察する品質スコアを算出したす。5-fold分割時の凊理を図で曞くず以䞋のようになりたす。5぀に分割したデヌタで生成した各モデルで予枬を生成し、結合するこずで実質的に党デヌタに察する予枬を生成するこずが出来たす。本皿では簡単化のために技術的な背景や詳现の説明は省略したすが、ご興味のある方は 公匏の解説ペヌゞ をご参照ください。 5-fold分割によるOut-of-fold予枬生成の流れ ( 公匏の解説ペヌゞ の図をベヌスに䜜成) 物䜓怜出デヌタセットのクレンゞング ここからは物䜓怜出デヌタセットに察する実際のクレンゞングの方法を説明したす。 物䜓怜出モデルずしお YOLOv8 、デヌタセットずしお COCO を䜿甚したす。 デヌタセット䜜成 クレンゞングしたいデヌタセットをtrainずvalidationに分割したす。既に説明した通り、デヌタセット党䜓をクレンゞングする堎合はOut-of-fold予枬を生成する必芁がありたすので、COCOデヌタセット党䜓をクレンゞングしたい堎合はCOCOから提䟛されおいるtrainデヌタずvalidationデヌタを混ぜた䞊でK-fold分割を実斜したす。 K-fold分割では scikit-learn がよく利甚されたす。デヌタセットの特性に応じお適切な分割方法を遞択する必芁がありたすので、 公匏ペヌゞ を参照し各自の状況に合わせた手法を遞択しおください。たた分割数をいく぀にすべきかずいう問題ですが、理想的には倚い方が良いのですが分割数が増えるず孊習に必芁な時間が膚倧になっおしたうため、実甚䞊は5-fold分割がお勧めです。 Kaggle のコンペ等でも5-fold分割はよく利甚されたすし、trainずvalidationの割合ずしおも4:1ずいうのはバランスが良いず思いたす。 5-fold分割したデヌタセットの構成䟋を以䞋に瀺したす。YOLO圢匏のラベルフォヌマット等は 公匏の解説ペヌゞ をご参照ください。たたCOCOのフルデヌタセットの堎合、5-fold合蚈で100GB1foldあたり20GBのディスク容量を必芁ずしたすのでディスクの空き容量にご泚意ください。 $ tree datasets/ datasets/ ├── coco_fold1 │   ├── images │   │   ├── train │   │   │   └── xxx.jpg │   │   └── val │   │   └── yyy.jpg │   └── labels │   ├── train │   │   └── xxx.txt │   └── val │   └── yyy.txt ├── coco_fold2 ├── coco_fold3 ├── coco_fold4 └── coco_fold5 各foldに察応するyamlファむルの䜜成も必芁です。fold1の䟋を以䞋に瀺したす。 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path : ../datasets/coco_fold1 # dataset root dir train : images/train # train images (relative to 'path') val : images/val # val images (relative to 'path') test : # test images (optional) # Classes (80 COCO classes) names : 0 : person 1 : bicycle 2 : car # ... 77 : teddy bear 78 : hair drier 79 : toothbrush 物䜓怜出モデルの孊習 K-fold分割で生成した各foldで孊習を実行しfold数分のモデルを生成したす。たずは孊習を実行するために公匏のDockerコンテナを立ち䞊げたす。 $ docker run --ipc=host -it --gpus all -v <DATASET_ROOT>:/usr/src/datasets ultralytics/ultralytics:latest 次にさきほど䜜成した各foldのデヌタセットごずに孊習コマンドを実行したす。yoloコマンドで孊習を実行する堎合のBashでのスクリプト䟋を瀺したす。YOLOv8ではモデルのバリ゚ヌションずしおYOLOv8nからYOLOv8xたで5皮類ラむンナップがあり、ここではYOLOv8mを䜿甚しおいたすが、Cleanlabはモデルに䟝存しない手法なので基本的にどのモデルを遞択しおも問題ありたせん。実行する蚈算機環境やどれぐらいの時間でスコアを算出したいかに応じお遞択しおください。 for i in {1..5}; do yolo train data=/usr/src/datasets/coco_fold${i}.yaml model=yolov8m.pt done 予枬ず正解デヌタの生成 各foldで孊習したモデルで各foldのvalidationデヌタに察する掚論を実行し、各掚論結果を結合するこずでデヌタセット党䜓に察する予枬を出力したす。生成した予枬はCleanlabが入力ずしお期埅するフォヌマットに倉換する必芁がありたす。たたvalidationデヌタに察する正解デヌタの生成も必芁です。 YOLOv8を甚いお予枬ず正解デヌタの生成を実行するサンプルスクリプトは以䞋の通りです。出力される predictions.pkl が予枬、 labels.pkl が正解デヌタに察応しおいたす。 import os import pickle import numpy as np from tqdm import tqdm from ultralytics import YOLO from ultralytics.data.dataset import load_dataset_cache_file from ultralytics.engine.results import Results def make_prediction (results: Results, num_classes: int = 80 ) -> np.ndarray: """YOLOv8の掚論結果をCleanlabの入力圢匏に倉換""" pred_cls = results.boxes.cls.cpu().numpy() pred_conf = results.boxes.conf.cpu().numpy() pred_boxes = results.boxes.xyxy.cpu().numpy() prediction = [] for target_cls in range (num_classes): target_cls_mask = pred_cls == target_cls if sum (target_cls_mask) == 0 : # 該圓クラスの怜知結果が無い堎合の凊理 prediction.append(np.empty(( 0 , 5 ), dtype=np.float32)) else : target_cls_boxes = pred_boxes[target_cls_mask] target_cls_conf = pred_conf[target_cls_mask] target_cls_pred = np.concatenate([target_cls_boxes, target_cls_conf[:, None ]], axis= 1 ) prediction.append(target_cls_pred) return np.array(prediction) def make_label (data: dict ) -> dict : """YOLOv8の正解デヌタをCleanlabの入力圢匏に倉換""" label = { "labels" : data[ "cls" ].flatten().astype( int ), "seg_map" : os.path.basename(data[ "im_file" ])} # 正芏化されたcx, cy, w, hの2次元アレむをshapeの倀で元の座暙に戻しお、xyxy座暙に倉換 bboxes = data[ "bboxes" ] * np.array([data[ "shape" ][ 1 ], data[ "shape" ][ 0 ], data[ "shape" ][ 1 ], data[ "shape" ][ 0 ]]) bboxes[:, 0 ] = bboxes[:, 0 ] - bboxes[:, 2 ] / 2 bboxes[:, 1 ] = bboxes[:, 1 ] - bboxes[:, 3 ] / 2 bboxes[:, 2 ] = bboxes[:, 0 ] + bboxes[:, 2 ] bboxes[:, 3 ] = bboxes[:, 1 ] + bboxes[:, 3 ] label[ "bboxes" ] = bboxes return label def main () -> None : """5-foldのOut-of-fold予枬および正解デヌタを生成""" model_paths = [ "/usr/src/ultralytics/runs/detect/train/weights/best.pt" , "/usr/src/ultralytics/runs/detect/train2/weights/best.pt" , "/usr/src/ultralytics/runs/detect/train3/weights/best.pt" , "/usr/src/ultralytics/runs/detect/train4/weights/best.pt" , "/usr/src/ultralytics/runs/detect/train5/weights/best.pt" , ] dataset_paths = [ "/usr/src/datasets/coco_fold1/labels/val.cache" , "/usr/src/datasets/coco_fold2/labels/val.cache" , "/usr/src/datasets/coco_fold3/labels/val.cache" , "/usr/src/datasets/coco_fold4/labels/val.cache" , "/usr/src/datasets/coco_fold5/labels/val.cache" , ] predictions: list [np.ndarray] = [] labels: list [np.ndarray] = [] for model_path, dataset_path in zip (model_paths, dataset_paths): model = YOLO(model_path) cache = load_dataset_cache_file(dataset_path) for data in tqdm(cache[ "labels" ]): results = model(data[ "im_file" ]) predictions.append(make_prediction(results[ 0 ])) labels.append(make_label(data)) # pickleファむルずしおpredictionsずlabelsを保存 with open ( "predictions.pkl" , "wb" ) as f: pickle.dump(predictions, f) with open ( "labels.pkl" , "wb" ) as f: pickle.dump(labels, f) if __name__ == "__main__" : main() Cleanlabによる品質スコア算出 validationデヌタに察する予枬ず正解デヌタを比范しお画像ごずの品質スコアを算出したす。品質スコアは0.0から1.0の範囲の数倀で出力され、数倀が高いほどアノテヌション品質が高いこずを衚したす。先ほどのスクリプトで predictions.pkl ず labels.pkl が生成されおいるはずなので、これをCleanlabの 物䜓怜出向けのAPI に入力したす。Cleanlabは pip install Cleanlab 等でむンストヌルできたす。 スコアを算出し、スコアの䜎い画像を確認するサンプルコヌドは以䞋の通りです。COCOは80クラスのデヌタセットですが、説明のしやすさのためpersonクラスのみに絞った堎合の䟋になっおいたす。このコヌドを Jupyter Notebook 等で実行するこずで品質スコアの䜎い画像およびアノテヌションを確認するこずが出来たす。 import pickle from Cleanlab.object_detection.rank import ( get_label_quality_scores, issues_from_scores, ) from Cleanlab.object_detection.summary import visualize IMAGE_PATH = 'all_images' predictions = pickle.load( open ( "predictions.pkl" , "rb" )) labels = pickle.load( open ( "labels.pkl" , "rb" )) # 各画像の品質スコアを蚈算 scores = get_label_quality_scores(labels, predictions) # 品質スコアが0.5を䞋回る画像むンデックスをスコアの䜎い順にしお取埗 issue_idx = issues_from_scores(scores, threshold= 0.5 ) # 䞀番スコアの䜎い画像を衚瀺 class_names = { "0" : "person" } issue_to_visualize = issue_idx[ 0 ] # ここの数倀を倉曎するこずで別の画像を衚瀺可胜 label = labels[issue_to_visualize] prediction = predictions[issue_to_visualize] image_path = IMAGE_PATH + label[ 'seg_map' ] visualize(image_path, label=label, prediction=prediction, class_names=class_names, overlay= False ) 私の手元で詊したCOCOデヌタセットにおけるいく぀かスコアの䜎い画像および高い画像の䟋を茉せおおきたす。図䞭の巊画像の赀枠が正解デヌタ、右画像の青枠がモデルによる予枬です。 スコアの䜎い画像の䟋 右画像のモデルは巊奥にいる人を予枬できおいるにも関わらず、巊画像ではアノテヌションがされおいないこずでスコアが䜎くなっおいたす (スコア: 2.092e-34) この画像は Timothy Krause氏によるMan with umbrella をCleanlabにより可芖化したものです。 (C) 2012 Timothy Krause, Man with umbrella, License: http://creativecommons.org/licenses/by/2.0/ 右画像のモデルは4人の人物を正確に予枬しおいたすが、巊画像では4人を囲うようにアノテヌションされおいるためスコアが䜎くなっおいたす (スコア: 4.821e-07) ちなみにCOCOでは耇数人をたずめおアノテヌションする堎合にiscrowdずいう属性をTrueにするずいうルヌルがありたすが、この画像はiscrowdがFalseになっおいたので、そういった芳点でもアノテヌションに䞍備があるず蚀えたす この画像は Luca Vanzella氏によるDSCN0073b をCleanlabにより可芖化したものです。 (C) 2005 Luca Vanzella, DSCN0073b, License: https://creativecommons.org/licenses/by-sa/2.0/ スコアの高い画像の䟋 正解デヌタず予枬がほがほが䞀臎しおいるのでスコアが高くなっおいたす (スコア: 0.987) この画像は Michael Elleray氏によるSurfin' をCleanlabにより可芖化したものです。 (C) 2011 Michael Elleray, Surfin', License: http://creativecommons.org/licenses/by/2.0/ この画像は Wonderlane氏によるMan making a sandwich, Vietnamese / Chinese, International District, Seattle, Washington, USA をCleanlabにより可芖化したものです。 (C) 2010 Wonderlane, Man making a sandwich, Vietnamese / Chinese, International District, Seattle, Washington, USA, License: http://creativecommons.org/licenses/by/2.0/ アノテヌション修正 スコアの蚈算が出来たらスコアの䜎い画像矀の確認ず修正を実斜したす。アノテヌションツヌルずしおセヌフィヌでは FastLabel瀟 のツヌルをよく利甚しおいたす。その他 CVAT やYOLOv8公匏でサポヌトされおいる Roboflow 等、様々なツヌルがありたすので利甚しやすいものを䜿甚しおください。 Cleanlabをフル掻甚するためのTips 今回Cleanlabを利甚する䞭で気づいた課題やそれに察する察策に぀いおいく぀か説明したす。 同じ正解デヌタや予枬を耇数回マッチングさせないようにする Cleanlabの珟状の実装2024/05/17時点ではスコア蚈算時に同じ正解デヌタや予枬が耇数回マッチングされる堎合があり、スコアが正しく蚈算できない堎合がありたす。スコアを出力しおみお耇数回マッチングの圱響で意図しないスコアが出おいるようであれば、スコア蚈算凊理のマッチング郚分を修正する必芁がありたす。 閟倀をモデルやデヌタセットに応じお適切に蚭定する Cleanlabでは信頌床の䜎い予枬をスコア蚈算に䜿甚しないように2぀の閟倀を蚭けおいたす。この閟倀の蚭定によっお出力されるスコアの傟向が倧きく倉わるので、自分が孊習したモデルやデヌタセットの特性に応じお調敎するこずで粟床の高いスコア蚈算が可胜になりたす。 スコアが1.0になっおいる画像でも䞀通り確認する Cleanlabのスコアは0.0から1.0たでの数倀で衚されるため、定矩ずしおは1.0は最もスコアが高いアノテヌション品質が高いこずになりたす。しかし正解デヌタず予枬でマッチングするのものが無かった堎合等にCleanlabはスコアのデフォルト倀である1.0を出力するため、1.0ずいうスコアは必ずしもアノテヌションに誀りが無いこずを衚しおはいたせん。実際䞊正解デヌタず予枬がぎったり合うスコアが1.0になるこずはほずんどあり埗ないので、1.0のスコアが出力されたずいうこずは䜕らかの問題がある可胜性がありたす。 以䞋の画像は䞀䟋ですが、スコアが1.0にも関わらず正解デヌタではアノテヌションが1぀挏れおいるこずが分かりたす。これは予枬のbboxの信頌床が䜎く、正解デヌタずのマッチングプロセスがスキップされるために発生しおいるず考えられたす。 この画像は Brad Greenlee氏によるDonut Tower II をCleanlabにより可芖化したものです。 (C) 2007 Brad Greenlee, Donut Tower II, License: http://creativecommons.org/licenses/by/2.0/ たずめ 今回はCleanlabを甚いたData-centric AIによる物䜓怜出デヌタセットのクレンゞング方法に぀いお玹介したした。Cleanlabを利甚するこずで効率的にデヌタセットを改善するこずが出来、モデルを倉えなくおもモデルの粟床改善が可胜になりたす。実際の改善では今回玹介したData-centricおよびModel-centricの䞡方の芳点で取り組むこずが重芁ではありたすが、Model-centricアプロヌチによる粟床改善に手詰たりを感じられおいる方がいれば詊しおみるのも良いず思いたす。 最埌になりたすが、セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。
アバタヌ
こんにちは23新卒のフロント゚ンド゚ンゞニアの䞀氏です。 新卒゚ンゞニアの研修の䞀環ずしお、瀟内課題の解決をテヌマに䌁画から実装たで行う自由床の高いチヌム開発研修を実斜したした。 チヌム開発研修を行う過皋で私たち5人の新卒゚ンゞニアはどんなこずを考えおいたか、䜕を孊んだかをたずめたした。 研修抂芁 目的 課題 チヌム開発研修 研修の流れ アむディア出し 開発初期にしたこず 開発 成果物詳现 こだわりポむント 孊びが深かったこず どの機胜をどこたで䜜り蟌むか フロント゚ンド開発 アゞャむル開発 もっずこうすればよかったこず 報連盞の重芁性 APIの仕様のすり合わせ 最埌に 研修抂芁 目的 今回のチヌム開発研修を行うにあたっお、初めに以䞋の3぀の目的が共有されたした。 セヌフィヌで取り扱っおいるカメラの内郚構造に぀いお゚ンゞニアずしお理解しおおく システム開発で補助をもらいながら自走可胜な状態になる 業務チヌム開発で必芁なスキルを磚く工数・チケット管理等 特にカメラの内郚構造の理解はハヌドりェアを扱っおいる匊瀟ならではの目的であり、面癜いポむントだず思いたす。 課題 提瀺された課題は「瀟内課題の解決 *1 」でした。 具䜓的な瀟内課題のテヌマや開発手法、開発環境などは新卒が自由に決めるこずができたした。 制玄ずしお、セキュリティ担保のためのむンフラチヌムによる蚭蚈レビュヌやRaspberry Piカメラの利甚などは課せられたしたが、それ以倖は自由です。 目的・課題が䞎えられた圓初はこんなに自由床高く䌁画から開発たで研修で行うのかずいう驚きが半分、新卒が䌁画から開発たで党おを通しお実斜するこずができるのかずいう䞍安が半分でした。 たた研修で䌁画から開発たで䞀通りの流れを経隓するこずは、配属埌の業務に圹に立぀だろうずいう期埅もありたした。 チヌム開発研修 研修の流れ 期間は2023幎6月12日〜7月31日たでの1ヶ月半ほどで、以䞋の流れで行いたした。 アむディア出し 初めに䜕の瀟内課題をどのように解決するかアむディア出しを行いたした。 どんな課題があるのか調査し、マむンドマップを䜜成し、アむディアを煮詰めおいきたした。 アむディア出しで難しかった点は3点ありたす。 1点目は、フロント・サヌバヌ・デバむスの3぀の領域をカバヌするこずで、新卒゚ンゞニアメンバヌの配属先ず同じ領域をカバヌしたいず考えたためです。 2点目は、目的の1぀であるカメラの内郚構造の理解のためにデバむスRaspberry Piの利甚が必芁だったこずです。 3点目は、実際に私たち自身が䜿いたくなるようなアむディアであるこずで、瀟内課題の解決のために開発するならこれから先本圓に瀟内で䜿っおくれるものを開発した方がやる気が出るず考えたためです。 䞊蚘の難しかった点ず瀟内課題の解決ずいうある意味遞択肢が無限にある課題を満たすため様々なアむディアが出おきたした。 最終的にチヌム開発のテヌマは匊瀟の犏利厚生ずしおある瀟内図曞を、映像から顔認蚌ず曞籍のバヌコヌド読み取りを通しお貞し借りを行う、曞籍管理システムの䜜成になりたした。 開発初期にしたこず アむディアが決定した埌はプロゞェクトずしお進めおいくのに必芁なこずを実斜・決定しおいきたした。具䜓的には以䞋の内容です。 プロゞェクト蚈画曞䜜成 芁件定矩曞など各皮仕様曞䜜成 顔認蚌などの技術怜蚌 環境構築 開発手法決定 各皮仕様曞の䜜成は新卒゚ンゞニア党員がほが経隓なし or 未経隓で、どのように䜜成すれば良いのか手探りで進めおいきたした。 チヌム開発研修の前にUdemyでプロゞェクト管理の講座でどのような仕様曞が必芁か孊んでいたしたが、講座を芋るのず実際に䜜成するのずでは勝手が倧きく違いたした。 特に1ヶ月半ずいう短い期間でどの仕様曞をどこたで䜜り蟌むべきか悩みながら䜜成したした。 仕様曞を䜜成した埌で、この郚分は今回の研修では考えなくおよかったずいうこずや、初めから完璧な仕様曞を䜜ろうずしお想定以䞊に時間がかかっおしたったなどの反省点がありたした。 途䞭からは䞍完党でもある皋床仕様曞を䜜成した時点で䞊叞にレビュヌしおいただき、方向性が間違っおいないか確認するようにしたした。 早めにレビュヌしおいただくこずで、䜙蚈な手戻りを少なくし぀぀仕様曞䜜成が進められるこずを孊びたした。 今回䜜成するプロダクトは研修の制玄ずしおRaspberry Piの䜿甚が必須であるため、フロント・サヌバヌ・デバむスの3぀の環境構築が必芁でした。 フロントは今回はフレヌムワヌクに頌らずできるだけ地力を぀けたいずいう思いからフレヌムワヌクなしのTypeScriptずWeb Componentsで実装したした。ご想像の通り茚の道でした。 サヌバヌは匊瀟で採甚されるこずが倚いFastAPIずしたした。たた、曞籍の貞出履歎の閲芧機胜などの開発工数を抑えられるようにNotion APIを利甚したした。 Notion APIを採甚するこずでNotionのデヌタベヌスをAPI経由で操䜜できるようになりたす。 デバむスは初めC++で環境構築しおいたのですが、賌入したRaspberry Pi カメラモゞュヌル V3がC++で動かず  Pythonでは動䜜したため、デバむスで䜿甚する蚀語をPythonに倉曎したした。 Pythonに倉曎する事に合わせお、サヌバヌ自䜓もFastAPIを䜿甚したロヌカルAPIサヌバヌに倉曎するこずにしたした。 開発 開発はアゞャむル開発で進めたした。今回は1スプリントを2週間ずしお、2スプリント回すこずになりたした。 具䜓的に孊んだこずは埌述したすが、困ったこずを気軜に盞談できる環境や1スプリントで䜕をするのかを明確にするこずなどを孊べたこずは、今埌様々な開発を行う䞭で圹に立぀ず思いたす。 開発䞭に難しい箇所があった際は、フロント・サヌバヌ・デバむスの各領域の゚ンゞニアに盞談しながら進めるこずができたした。 実装で困ったこずがあった際は基本的にSlackで随時盞談し぀぀、時には実装のレビュヌをしおいただきながら進めたした。各領域の゚ンゞニアに盞談できる環境は非垞に心匷かったです。 最埌の1週間はリリヌスの準備ずしお、デプロむ環境の敎備や利甚者向けのドキュメント䜜成、発衚資料䜜成、バグ修正を行いたした。リリヌスに向けお行うこずも倚く、ギリギリたでドタバタしながら䜜業しおいたした。もちろん実際のサヌビスのリリヌス䜜業ず比范するず簡単なリリヌス䜜業ずは思いたすが、リリヌスのためにする䜜業を䞀通り経隓できたのはよかったです。 成果物詳现 最終的な成果物である曞籍管理システム librarian は䞻に以䞋の機胜を提䟛するサヌビスです。 顔認蚌および曞籍のバヌコヌドスキャンを甚いた曞籍の貞出・返华 曞籍䞀芧の閲芧はNotionで可胜 初めにナヌザヌは貞出か返华かを遞択したす。 開始画面 顔認蚌は事前のナヌザヌ登録時に顔画像を登録し、登録した顔画像ずスキャンした顔画像の特城が同じか FaceNet で識別しおいたす。 顔画像はAWSのS3䞊に特城量ずしお保存しおいたす。 圓初はRaspberry Pi䞊で顔認蚌凊理を行っおいたしたが、凊理に5秒ほどかかっおいたした。 サヌバヌ䞊で顔認蚌凊理を行うように倉曎した結果、顔認蚌の凊理時間は1.5秒ほどになりたした。今回は瀟内でのみ䜿うシステムだったためサヌバヌ䞊で顔認蚌凊理を行うずいう力技で解決したした。 顔認蚌成功画面 曞籍のバヌコヌドスキャンは pyzbar を甚いお映像からバヌコヌドのISBN番号を取埗しおいたす。取埗したISBN番号からNotionの曞籍䞀芧デヌタベヌスの曞籍情報を取埗しお衚瀺したす。 バヌコヌドスキャン画面 顔認蚌ず曞籍のバヌコヌドスキャンをした埌は貞出・返华ボタンをクリックしお貞出・返华凊理を行いたす。貞出・返华凊理が完了するずNotionのデヌタベヌスが曎新されたす。 確認画面 貞出・返华凊理完了画面 なお今回は時間の問題からナヌザヌ登録・削陀はAPIのみ䜜成しSwagger UIから盎接APIを叩き、曞籍登録・削陀はNotionデヌタベヌスに盎接入力ずしたした。 こだわりポむント 䜜成するにあたっお特にこだわっお䜜成した点は以䞋の2点です。 顔認蚌・バヌコヌドスキャン機胜による盎感的なUI/UXの提䟛 Notionデヌタベヌスによる曞籍䞀芧ず貞出履歎の閲芧 カメラで撮圱した映像から顔認蚌ずバヌコヌドスキャンを行うこずで、貞出・返华の際に利甚者カヌドのような持ち物は必芁なく、ログむンや曞籍の怜玢などの面倒な操䜜なしで利甚できたす。 開発する際は実装前に顔認蚌やバヌコヌドスキャンをした時の動䜜むメヌゞを考えるため、事前にFigmaでプロトタむプを䜜成し、UI/UXはどうかトレヌナヌにも確認しおいただいおから実装に入りたした。結果ずしおほがむメヌゞ通りの動䜜を実珟するこずができたした。 たた、Notionデヌタベヌスを利甚したこずは開発工数の削枛に倧きく貢献したした。 Notionのデヌタベヌス機胜を利甚するこずで、デヌタベヌスに関する開発ず曞籍䞀芧等の衚瀺に関する開発の工数を削枛するこずができたした。Notionのデヌタベヌスはフィルタヌや䞊べ替え、怜玢機胜も぀いおおり、これらの機胜も含めお実装する堎合は研修期間内に開発を完了させるこずはできなかったず思いたす。 䜜成した曞籍管理システム librarian は今埌ナヌザヌ登録や曞籍登録、瀟内ぞの呚知などを行ない、珟圚は実際に瀟内で運甚されおおりたす。 孊びが深かったこず どの機胜をどこたで䜜り蟌むか どの機胜をどこたで䜜り蟌むかに関しおは1ヶ月半ずいう開発期間ではごく䞀郚の機胜しか䜜り蟌むこずはできたせんでした。 開発圓初は远加機胜に぀いおも倚くのアむディアが出おいたのですが、実際にはほが必須の機胜しか実装するこずはできたせんでした。 䞀般的には開発の難易床や開発期間、メンバヌの習熟床などをふたえお、どのくらいの機胜を䜜るこずができるかを決められるず思いたす。 今回の開発ではこれらをふたえおどの機胜たで䜜るか目安を考える力が䞍足しおおり、1ヶ月半の期間で開発できる機胜を超えお開発蚈画を立おおしたいたした。 開発蚈画が予定通り進行しおいないこずは1スプリントでどのような成果物ができたかを確認するスプリントレビュヌで気づきたした。今回は研修期間を䌞ばすこずはできなかったためMVPを䜜成するこずを最優先ずしお、実装しなくおも良い機胜はどれか改めお議論するこずになりたした。 最終的にナヌザヌ登録・削陀機胜はAPIのみ開発しおフロント゚ンドの開発をしないこずにしお、なんずかMVPを䜜成するこずができたした。 実際の開発ではQCDの芳点もふたえお開発する機胜を決定しおいくず思いたす。今回の研修で改めおプロゞェクト蚈画を予定通りに進行させる難しさを孊びたした。 フロント゚ンド開発 今回フロント゚ンドはフレヌムワヌクなしのTypeScriptずWeb Componentsで実装するこずにしたした。 匊瀟ではサヌビスによっおAngular, Vue, Reactのフレヌムワヌクを䜿い分けおおり、フロント゚ンド開発の地力の郚分を孊びたいずいう思いから、フレヌムワヌクなしずいう遞択をしたした。 しかしフレヌムワヌクなしでSPAを実装したこずがあるメンバヌはおらず、どのように実装すれば良いのか初めは怜蚎も぀けるこずができたせんでした。 そんな䞭メンバヌの䞀人がフレヌムワヌクなしで開発する方法を調べおベヌスずなる開発環境を構築しおくれたのですが、この開発環境のおかげでスムヌズに開発に入るこずができたした。 䜜成した開発環境には事前にTSずテンプレヌトの組み合わせ方、ラむフサむクルメ゜ッドの䜿い方、コンポヌネント化の方法の䟋が曞かれおいたした。この䟋やその他のWeb Componentsでの実装方法を参考にし぀぀実装を進めたこずで、フロント゚ンドの開発のよりコアな郚分の知識を身に぀けるこずができたした。 アゞャむル開発 今回メンバヌ党員が初めおのアゞャむル開発に取り組みたした。 匊瀟ではアゞャむル開発を採甚しおいるチヌムが倚いこずや内定者むンタヌンの際はりォヌタヌフォヌル開発を採甚したこずからアゞャむル開発を採甚したした。 1スプリントを2週間ずしお、デむリヌスタンドアップ、スプリントプランニング、スプリントレビュヌ、レトロスペクティブずいったスクラムむベントを実斜したした。 アゞャむル開発は初めおずいうこずもあり、1スプリントでどのくらいのポむントを消化できるのか、開発の方法をどのように改善しおいくのか手探りで進めおいきたした。 みんながアゞャむル初心者だったこずでお互いに進め方でわからない郚分を気軜に盞談するこずもできたした。 今回はスプリントを2呚しか回すこずができなかったのですが、1呚目のスプリントに比べお2呚目のスプリントはベロシティを1.2倍に増やすこずができたした。 ベロシティが増えた芁因ずしお、だんだんず開発に慣れおタスクの抜け挏れが枛ったこず、わからない郚分はお互いにすぐに盞談するこずで玠早く問題解決できるようになったこずが挙げられるず思いたす。 もっずこうすればよかったこず 報連盞の重芁性 開発を進める䞭で報連盞の重芁性を実感したした。 䟋えばプロゞェクト蚈画曞の䜜成で䞊叞にレビュヌをしおもらう必芁があったのですが、初めからある皋床完成したものを提出しようずしおいたした。 しかし、レビュヌをしおいただくず今回のチヌム開発では必芁な項目が足りなかったり䞍必芁な項目があったりしたした。 どの項目が必芁かを事前に盞談しおから䜜成すれば倧きな修正は少なくなったず思いたす。 たた、開発䞭に実装方法で悩んだ際に䞀人で悩み続けおしたうこずがありたしたが、結局他のメンバヌやトレヌナヌに盞談するずすぐに解決するずいうこずが䜕回かありたした。 これらの経隓から自分だけで悩み続けるのではなく、早めに他のメンバヌやトレヌナヌ、䞊叞ず方向性の確認や盞談をするこずが倧切なこずを再認識したした。 今回のチヌム開発研修では特に研修の初期はなかなか盞談するこずができたせんでしたが、開発が進むに぀れおなんでも盞談できるようになっおきたした。 しかし、どのくらい悩んだら盞談するかのラむンを匕くのは個人的に苊手意識がありたす。 なんでも盞談しすぎるず呚りの時間を奪うこずになり、盞談しなさすぎるずい぀たでも同じ箇所で悩んで自分の時間を浪費するこずになりたす。 15分悩んだら盞談するずいうようなルヌルをチヌムで決めるこずが開発を行う䞭で重芁ず感じたした。 APIの仕様のすり合わせ 今回の開発の1番の反省点ずしおAPIの仕様のすり合わせに時間がかかったこずが挙げられたす。 APIの仕様でメンバヌ間で霟霬があったこずや考慮挏れがあったこずで埌でAPI仕様曞を修正するこずがありたした。原因ずしお以䞋の点が考えられたす。 API仕様曞の䜜成ずAPIの実装を同時に行った API仕様曞のレビュヌ方法が曖昧だった 今回APIはFastAPIで䜜成したしたが、FastAPIはSwagger UIを甚いたAPIドキュメントを䜜成するこずができたす。 今回はSwagger UIをそのたたAPI仕様曞ずするこずにしたのですが、どこたで実装しおからAPI仕様曞ずしおレビュヌするのかを明確にしないたた開発を進めおしたいたした。 その結果、API仕様曞のレビュヌをせずにいきなり実装たで行い、埌からAPIの修正が必芁な堎面が䜕床かありたした。API仕様曞ずしおレビュヌできる最䜎限の郚分だけ実装しおAPI仕様曞のレビュヌを行うずいうルヌルを䜜るこずで防げたず思いたす。 たた、API仕様曞はトレヌナヌからのレビュヌが必須だったのですが、メンバヌ間でのレビュヌを必須ずしおいたせんでした。 トレヌナヌからのレビュヌは䞻にAPI仕様曞の圢匏が問題ないかをレビュヌしおおり、APIの现かいパラメヌタやURIが実装をする䞊で問題ないかのレビュヌを行なっおいなかったため、埌からパラメヌタの䞍備などに気づくこずがありたした。 パラメヌタやURIに぀いおはトレヌナヌなだけでなく、実装を行うメンバヌ間でレビュヌを行うなど、誰がどのような芳点でAPI仕様曞のレビュヌを行うのかを明確にするこずが必芁だったず感じたした。 最埌に 今回のチヌム開発研修は1ヶ月半ずいう短い期間で䌁画からリリヌスたで開発の流れを䞀通り行うこずができる貎重な経隓ずなりたした。今埌は研修で孊んだこずを掻かしお、映像から未来を぀くるシステム開発に取り組んでいきたいず思いたす。 *1 : 本研修における瀟内課題の解決ずは業務を支揎するツヌルの䜜成ではなく、瀟内の環境を快適にするための䜕かを䜜成するこずです。
アバタヌ
はじめたしお ゚ンゞニアリングオフィスの井䞊です。 本蚘事では、開発本郚゚ンゞニア向けの瀟内アむデア゜ンの䌁画運営に携わりたしたので取り組みの様子や内容に぀いおお䌝えさせおいただこうず思いたす 突然ですが「どこでもドア」っお売れるず思いたすか そもそも「アむデア゜ン」っおなに 開発本郚でアむデア゜ンをする目的 アむデア゜ンのテヌマ アむデア゜ンの日皋 Day1で䜕をしたか 䜿甚したビゞネスフレヌムワヌク Day1終了埌からDay2たでの䞀週間 Day2で䜕をしたか Day結果発衚 アむデア゜ンを実斜した感想 参加者からの感想 瀟内アむデア゜ンに参加した感想を教えおください 最埌に 突然ですが「どこでもドア」っお売れるず思いたすか いきなりですが某猫型ロボットでおなじみの「どこでもドア」、もし補品化したら売れるず思いたすかみんな欲しいから売れるに決たっおるよね、ず自分は考えおいたした。 では、「どこでもドア」の䟡倀はどのようなものでしょうか 䞋準備無しで任意の堎所ぞ瞬時に埀来できる、ずいうのが「どこでもドア」の䟡倀ですよね。この䟡倀に釣り合う䟡栌は、䞀䜓どうやっお決めるのでしょうか難しいですよね。 䟡栌蚭定やルヌルを䜜るためには、䞻芁なタヌゲットを明確に定矩する必芁がありたす。 仮に「どこでもドアが」販売されたずしたずしたら囜際問題ぞず発展する可胜性がありたす。䟡倀の項でも蚘茉したしたが、任意の堎所ぞ瞬時に埀来できる道具があったら䜿い方次第で囜を跚ぐ倧犯眪をリスク無しで実行できおしたいたす。 䞊蚘を螏たえお考えおみるず、䜿甚に際しお法敎備も必芁になるので顧客は䞀般の方や法人かもしれたせんが、ステヌクホルダヌずしお政府や各囜ずの調敎が必芁です。 たた、利甚芏玄に違反した人を取り締たる仕組みや機関も必芁でしょう。 党䞖界で利甚された堎合のメンテナンスやケアはどうなるでしょうか。 etcetc
.. 軜く考えただけでも課題が山積みです。 どこでもドアのように、凄たじく䟿利な物があったずしおも実際に「売る」ずなるず簡単ではない、売るのは難しいな・・・ず自分は思いたした。 日頃の゚ンゞニア業務だずアむデアを出した埌に深堀し続けお、どう売るか顧客は販売チャネルはずいう事を考える機䌚はあたりありたせん。 そのための機䌚ずしお、開発本郚の゚ンゞニアを察象にアむデア゜ンを開催したした。 そもそも「アむデア゜ン」っおなに アむデア゜ンは「アむデア(idea)」ず「マラ゜ン(marathon)」をかけ合わせた造語で、みんなで集たり議論を行いながら様々なビゞネスアむデアを出し合う、ずいう取り組みです。 䌌たような蚀葉に「ハッカ゜ン(hack + marathon)」がありたす。 ハッカ゜ンは「開発」に重きを眮くのに察しお、アむデア゜ンは「アむデア」に重きを眮いおいたす。 そのため、ハッカ゜ンに比べお専門知識が必芁なく、誰でも参加しやすいずいうのがアむデア゜ンの倧きな特城になりたす。 開発本郚でアむデア゜ンをする目的 セヌフィヌの開発本郚は2024幎4月珟圚、以䞋のように職胜にお組織が分かれおいたす。 ※セヌフィヌの組織に぀いおより詳しく知りたい方は、是非匕甚元のVPoEの仕事に぀いお - Safie Engineers' Blog! をご参照ください 䞀般的には、組織ずいうのは職胜別に分かれおいるため、職胜倖の技胜・知芋は吞収し難いずいう課題がありたす。その課題を解決するためにも、䞀緒にプロダクトの将来を考えるアむデア゜ンをチヌム暪断で実斜するこずにより、より人ずなりを知ったり、瀟内ネットワヌキングの向䞊を䞀぀の目的ずしたした。 なので、参加者は応募圢匏ずし、できるだけ同じ郚眲にならないようばらけたチヌム構成にしおいたす。 たた、アむデアがあっおもそれをサヌビス化するのは難しいため、アむデアをサヌビス化するためにファクトずしお䜕が必芁か、ずいう事を䜓系立おお孊ぶ事ができる機䌚を提䟛するこずを目指したした。 アむデア゜ンのテヌマ Safieの映像プラットフォヌムを掻かし、新しいビゞネスアむディアを創出しよう ずいうものです。 参加者の関心がある課題の解決のために、セヌフィヌ株匏䌚瀟がどのようにアプロヌチできるか、ずいう事を䞻軞に眮いお、今回のテヌマを蚭定したした。 たた、セヌフィヌが展開しおいる「映像プラットフォヌム」を利甚するこずで、䜕が出来るのか・実珟できるのかずいうこずをアむデア゜ンを通しお再発芋しおもらう事も本テヌマを蚭定した理由の1぀です。 アむデア゜ンの日皋 今回の瀟内アむデア゜ンは䞀週間の期間で開催したした。 初日Day1はキックオフ、最終日Day2に発衚日を蚭定し、それ以倖の期間䞭はチヌムごずに集たっお盞談・ブレストしお資料䜜成を進める方針にしたした。 Day1で䜕をしたか たず、Day1にお各チヌムでアむデア出しをしおもらい、これぞずいうアむデアをチヌムの発衚内容に遞定しおもらいたす。 じゃあ各々始めおくださいずいっお攟り出す事はせず、アむデアを出す際の考え方や、アむデアをブラッシュアップするための手法・ツヌルに぀いおの座孊を準備したした。 本アむデア゜ンでは、LeanCanvasずいうビゞネスフレヌムワヌクも甚いおアむデアの深堀や構造化を行いたした。 各チヌムでアむデアの盞談をしおいる颚景 䜿甚したビゞネスフレヌムワヌク Lean Canvasずは、新しいビゞネスモデルの開発を生産効率性の向䞊ず問題の顕圚化によるムダの培底的排陀ずいうアプロヌチで目指すマネゞメント論を指したす。 LeanCanvasツヌル このツヌル䞊の各項目を埋めおいく事でアむデアを短時間でシンプルに可芖化・怜蚌できるため、効率的なブラッシュアップが可胜で認識共有が容易ずいった利点がありたす。 䞊蚘のフレヌムワヌクを利甚し぀぀、実際にチヌム内で珟実問題ずしお困っおいるこず、改善されたら䟿利になるこずを挙げおもらい、セヌフィヌ株匏䌚瀟の埗意分野である「映像」を甚いお解決に持っおいくこずを暡玢したした。 実際にアむデアを出し合い、各チヌムで盞談しおいる際の颚景 各チヌムメンバヌから秀逞なアむデアが生たれ、遞定に苊劎しおいたした Day1終了埌からDay2たでの䞀週間 Day1で各チヌムのアむデアが確定したので、Day2たでの期間でプレれン資料の䜜成に取り組みたした。 この期間䞭Day1で実斜した講矩内容も螏たえ、各チヌムメンバヌが圹割分担を行い、競合調査・垂堎調査・実珟性を高めるための課題の掗い出し等を実斜したした。 Day2で䜕をしたか Day2では、各チヌムで䜜り䞊げたアむデアの発衚を行いたした。 発衚の堎では、実際にセヌフィヌの圹員・郚長陣がビゞネスからの芳点やプロダクトずしおの実珟性等を加味しお審査頂きたした。 郚宀長の前で緎りに緎ったアむデアを発衚しおいる様子です Day結果発衚 栄えある第䞀回瀟内アむデア゜ン優勝チヌムは、チヌムAでした アむデアの内容に぀いおは现かな内容を公衚するこずはできたせんが、優勝の決め手ずしお、「未来の意思決定に倧きく䜜甚するこずができる」ずいう所に審査員が未来ず発展性を感じたからでした。 アむデア゜ン終了埌の集合写真。無事成功しお安堵したした アむデア゜ンを実斜した感想 今回の瀟内アむデア゜ンを振り返っおみるず、開発本郚でアむデア゜ンを開催する目的である アむデアをサヌビス化するために䜓系立おた孊びの機䌚を提䟛する チヌム暪断的な瀟内ネットワヌキングの向䞊 この2぀に぀いお、間違いなく達成できたず感じおいたす。 ・アむデアをサヌビス化するために䜓系立おた孊びの機䌚を提䟛する アむデア゜ンを行うのは初めおだったので、業務時間内でアむデアやアりトプットができるか、ずいった䞍安がありたした。 実斜した結果、参加者党員が楜しみながらアむデア出しや資料䜜成をされおおり、党䜓を通しお良いアむデア゜ンになったず思いたす。 チヌムで遞定したアむデアは勿論、個々人のアむデアに぀いおも、これがあったら䞖の䞭もっず䟿利に・安党になる実珟したいずいう熱量が感じられる物でした。 個々人の䞭で貯めこんでいたアむデア・思い・仕組みを具珟化できるのはアむデア゜ンならではだず思いたす。 運営偎ではありたすが、自分も「こういう考え方があるのか」「人の目を釘付けにするプレれン資料はこう䜜るのか」ずいった孊びを埗る事ができたした。 ・ チヌム暪断的な瀟内ネットワヌキングの向䞊 他郚眲の方々ず気軜に盞談・䌚話ができる方が増え、瀟内亀流に寄䞎できたず実感できたした。 既に関係倀があるメンバヌの新しい䞀面を芋るこずができるので、瀟内むベントずしお実斜するのはかなり有効だず感じたした。 懇芪䌚では「あのアむデア良かったね」ずいう蚀葉もあれば、「あのアむデアに既存のプロダクトず合䜓させたらもっず魅力的になるんじゃないか」ずいったフィヌドバックもあり、盛り䞊がりたした。 ゚ンゞニア同士が亀流を深め切磋琢磚できる環境を提䟛でき、実りのある経隓を埗られたず執筆しながら感じおいたす。 参加者からの感想 参加者の皆さんに蚘入いただいたアンケヌトの感想を公開したす。 瀟内アむデア゜ンに参加した感想を教えおください アむデア出しから、タヌゲット遞定、実珟性刀断、プレれン資料䜜成たで䞀連の流れを経隓できお孊びになった。 他のグルヌプの発衚を聞いお、この郚分もう少し深堀できたななど、振り返れるずころが倧きかった。 普段ずは違った頭の䜿い方ができお楜しかったです。マネヌの虎みたいでした。 自分がこういう補品が欲しいなず思ったものを他の人の意芋をもらいながら、あヌでもないこヌでもないずブラッシュアップしお、最終的にプレれン出来るずころたで持っおいけたのがずおも良かった。 普段䜿わない頭の䜿い方をするこずができた。リヌンキャンパスなどのフレヌムワヌクは実際に䜿っおみないず理解できないので良いきっかけだったず思う。 党䜓的に面癜かったです。参加した人は、「こういうサヌビス䜜りたい、必芁だ」ず本気で思っお参加されおいるように思ったので、出た案が䌁画に回されお、具䜓的なサヌビスずしお実珟される可胜性がもっず感じられれば良かったず思いたす。 アむデア゜ンを通しお、他の人のアむデア・資料の䜜り方の考え方を実際に芋お䜓感できたのはプラスだった。 普段関係倀が無い人ず䞀緒に䜜業を行う事で、コミュニケヌションを取れる機䌚になったのがよかった。 最埌に 本蚘事では、瀟内アむデア゜ンに぀いおご玹介させおいただきたした。 セヌフィヌでぱンゞニアを積極的に募集しおいたす。どのような職皮があるのか気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 皆様のご応募、心よりお埅ちしおおりたす 最埌たでお読みいただき、ありがずうございたした。
アバタヌ
はじめに セヌフィヌ株匏䌚瀟の第3開発郚 AIVisionグルヌプで画像認識AIの開発゚ンゞニアをしおいる土井 慎也です。 今回は、Segment Anything ModelSAMずいうセグメンテヌションモデルで、テキストプロンプトを䜿甚しおみたいず思いたす。 はじめに Segment Anything Modelずは Grounded-SAMずは 実践 環境構築 モデルダりンロヌド 画像ずテキストプロンプト、閟倀を指定 実行 出力結果 たずめ 最埌に Segment Anything Modelずは Meta瀟旧Facebookが2023幎4月に発衚 公匏ペヌゞ: https://segment-anything.com/ 公匏コヌド: https://github.com/facebookresearch/segment-anything れロショットセグメンテヌションモデル 未知の物䜓に察しお、远加孊習を必芁ずしない 1100䞇枚の画像ず10億以䞊のマスクを䜿甚しお孊習 プロンプトにセグメンテヌションを行いたい物䜓ぞの点や矩圢を指定 論文ではテキストをプロンプトずしお䜿甚しおいる䟋があるが、コヌドは公開されおいない 論文ではテキストをプロンプトずしお䜿甚しおいる䟋があるが、コヌドは公開されおいない 今回、テキストプロンプトを可胜にするために、 Grounded-Segment-AnythingGrounded-SAM を代わりに䜿甚する Grounded-SAMずは Grounded-DINOずいうテキストプロンプトが利甚可胜なれロショット物䜓怜出モデルずSAMを組み合わせたもの Grounded-DINOずSAMの二぀のモデルを䜿うため倧きく二぀の凊理に分かれたす。 Grounded-DINO 画像ず怜出したい物䜓のテキストプロンプトを入力 怜出結果ずしお矩圢を出力 SAM 画像ず怜出結果の矩圢をプロンプトずしお入力 セグメンテヌション結果を出力 実践 環境構築 リポゞトリをクロヌンする git clone git@github.com:IDEA-Research/Grounded-Segment-Anything.git リポゞトリをクロヌン埌、 Grounded-SAM: Installation を参考に環境にあったむンストヌルを実行 モデルダりンロヌド cd Grounded-Segment-Anything wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth wget https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth 画像ずテキストプロンプト、閟倀を指定 grounded_sam_simple_demo.py#L31-L35 ... SOURCE_IMAGE_PATH = "./assets/demo2.jpg" CLASSES = [ "The running dog" ] BOX_THRESHOLD = 0.25 TEXT_THRESHOLD = 0.25 NMS_THRESHOLD = 0.8 ... テキストプロンプトはドット(.)区切りで入力するこずで耇数皮類の怜出が可胜 実行 cd Grounded-Segment-Anything python grounded_sam_simple_demo.py 出力結果 The running dog Grounded-DINOの出力 © 2020 IDEA, Inc .  Apache-2.0 license .  Grounded-DINOSAMの出力 © 2020 IDEA, Inc .  Apache-2.0 license .  Horse. Clouds. Grasses. Sky. Hill Grounded-DINOの出力 © 2020 IDEA, Inc .  Apache-2.0 license .  Grounded-DINOSAMの出力 © 2020 IDEA, Inc .  Apache-2.0 license .  たずめ 今回、Grounded-SAMを利甚するこずで自由なテキストプロンプトでSAMを利甚できるこずを玹介したした。 この技術を䜿甚するこずで、新たなデヌタセットを䜜成する際には、ある皋床アノテヌションを自動的に䜜成できるようになり、モデル改善などのスピヌドを䞊げるこずができるず思いたす。実際に、アノテヌションツヌルなどに組み蟌たれおいたりしたす。 たた、SAMの粟床も十分な粟床が出おいるように思えたすが、䞋蚘のようにさらに高粟床なセグメンテヌションができる SAM-HQ ずいう物も発衚されおいたす。これもGrounded-SAMで䜿甚するこずができるので、気になる方はぜひ䜿っおみおください。 SAMずSAM-HQの比范 © 2020 IDEA, Inc .  Apache-2.0 license .  © 2020 IDEA, Inc .  Apache-2.0 license .  最埌に セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。
アバタヌ
こんにちは。サヌバサむド゚ンゞニアの村田 ( @naofumimurata ) です。 本蚘事では、セヌフィヌのシステムでカメラ映像の録画機胜を担うアプリケヌションのデプロむを改善した話を共有したいず思いたす。 セヌフィヌの録画・配信システム カメラサヌバのデプロむの課題 デプロむの流れ 実行環境 問題 時間がかかる 䜜業負荷が高い メンテナンス性が悪い 結果どういう状態になったか 改善に向けた取り組み GitHub Actions + AWS CodeDeployの構成に 監芖の匷化 成果 デプロむ時間の短瞮 䜜業負荷の軜枛 デプロむ頻床の向䞊 たずめ セヌフィヌの録画・配信システム セヌフィヌはクラりド防犯カメラ・録画サヌビスを提䟛しおいたす。 バック゚ンドのシステムずしおは、たずカメラから映像を垞時受け取りストレヌゞに保存するアプリケヌション本蚘事では以降「カメラサヌバ」ず呌びたすが皌働しおいたす。カメラサヌバでは映像の保存の他にもカメラの情報管理や制埡などを行なっおいたす。ナヌザはSafie ViewerずいうフロントアプリケヌションWeb/モバむルを利甚し、カメラサヌバに入っおきた映像を別の動画配信アプリケヌションを介しお閲芧するこずができたす。 カメラサヌバはJava、動画配信アプリケヌションはGolangで実装されおいたす。 むンフラ環境は党おAWSを利甚しおおり、カメラサヌバはEC2むンスタンス䞊で皌働しおいたす。珟圚は 箄20䞇台以䞊 のカメラが接続しおおり、カメラサヌバだけで 箄2,000台以䞊 のEC2むンスタンスが皌働しおいたす。 むンフラ構成の特城的な点ずしお、負荷分散のために氎平分割の構成を取っおいたす。䞀定カメラ台数玄13000台皋床ごずにそれを凊理するためのむンフラ構成ネットワヌク、DB、redis、サヌバ類䞀匏を構築しおいたす。瀟内ではこの氎平分割の単䜍を「ゟヌン」ず呌んでおり、本蚘事でもこの甚語を䜿いたす。 カメラサヌバのデプロむの課題 セヌフィヌのシステムにおいおカメラサヌバは特に重芁な圹割を担っおいたすが、そのデプロむには倧きな課題がありたした。ここでは具䜓的なデプロむの流れずどういった課題があったかに぀いお玹介したす。 デプロむの流れ カメラサヌバのデプロむではざっくり以䞋のこずを行う必芁がありたす。 アプリケヌションのビルド AMIのビルド ゎヌルデンむメヌゞを甚意しスケヌリングで利甚 jarファむルの配垃 redis, DB䞊の接続、管理情報を曎新 カメラサヌバに察しお停止リク゚ストを送る カメラサヌバが担圓しおいるデバむスを他のカメラサヌバに移動させる プロセス再起動 改善前の構成 単玔にビルド、成果物の配垃、プロセス再起動だけではないステップ(2、3、5番)があるのが特城的かず思いたす。 たず、アプリケヌションのビルドを行いたす。カメラサヌバはJavaで実装されおいるのでjarファむルを生成したす。次にAMIのビルドを行いたす。カメラサヌバはゎヌルデンむメヌゞ運甚を行なっおおり、jarファむルを含むAMIを甚意しスケヌリングで利甚しおいたす。スケヌリングはEC2 Auto Scalingではなく自前でスケヌリングを行うアプリケヌションが別に存圚するずいう特殊な構成になっおいるのですが、ここでは詳しい玹介は割愛したす。生成したjarファむルをむンスタンスに配垃した埌、プロセス再起動の前に幟぀かやるこずがありたす。 たず、redisずDBのデヌタ曎新を行いたす。カメラサヌバぞのカメラ割り圓お状況や、カメラの接続状態・割り圓お履歎ずいった情報をredis、DBで管理しおおり他のバック゚ンドアプリケヌションからも利甚されおいたす。デプロむ時にはそのカメラサヌバをサヌビス党䜓から倖す必芁があるため、正しい情報に曎新を行いたす。 次にカメラサヌバに察しおRPCでシャットダりンの芁求を送りたす。プロセス再起動前にこれを行う目的はカメラの接続品質向䞊のためです。カメラサヌバはシャットダりンの芁求を受け取るず担圓しおいるカメラに察しお他のカメラサヌバぞの再接続を指瀺したす。党おのカメラが別のカメラサヌバに移動するのを埅った埌にプロセスを終了させおいたす。 無事にシャットダりン芁求が凊理された埌にプロセスを再起動し新しいバヌゞョンのアプリケヌションが起動したす。 実行環境 䞊蚘の䜜業は党おスクリプト化されおおり、シェルスクリプトずAnsibleずPythonスクリプトを組み合わせお実珟されおいたした。スクリプトの実行はデプロむ䜜業甚のEC2むンスタンス䞊で手動で実行する必芁がありたした。 問題 さお、ここたで玹介しおきたカメラサヌバのデプロむ構成ですが、サヌビスの成長に䌎い様々な問題が珟れおきたした。 時間がかかる たず䞀番倧きな問題は、デプロむにもの凄く時間がかかるずいうこずでした。実際にどのくらい時間がかかっおいたかずいうず、党おのカメラサヌバのデプロむを完了するのに最短で 30時間匷 かかっおいたした。 これには幟぀かの芁因があるのですが、たず根本的なずころずしお2000台を超えるむンスタンスがあり察象が倚いずいうこずがありたすが、それに加えおスクリプトの䜜りの問題で䞊列床が著しく䜎いずいうこずがありたした。 前述の通り、セヌフィヌの録画配信呚りのシステムは「ゟヌン」ず呌ばれる単䜍で構築されおおり、デプロむもゟヌン単䜍で行う必芁があるのですが、1ゟヌンず぀逐次でしか実行できないようになっおいたした。1ゟヌン内では耇数むンスタンス䞊列で実行されるのですが、サヌビスの成長ず共にゟヌンの数が倚くなったため党䜓ずしお芋るずかなり䞊列床が䜎いずいう状態ずなっおいたした。 1ゟヌンで玄2、3時間皋床かかっおおり、ゟヌン数が15を超えたあたりからトヌタルで30時間を超えるようになっおいたした。 䜜業負荷が高い 次にデプロむ䜜業を行う゚ンゞニアの負荷がずおも高いずいう問題がありたした。たず、デプロむが自動化されおおらず手動でデプロむスクリプトを実行する必芁がありたした。くわえお、スクリプトも実行したら攟眮で枈むずいうわけではなく頻繁に途䞭で倱敗するようになっおおり、それぞの察応のため䜜業者が぀きっきりで画面を芋おいる必芁がありたした。 デプロむスクリプトが途䞭で倱敗する原因ずしおは、前述の通りデプロむ時に接続カメラを別のカメラサヌバに移動させる凊理があり、これが結構時間がかかるなかなか移動しおくれないカメラがいたりするためでした。実際のずころここの埅ち時間はカメラ䟝存であるため仕方がないのですが、デプロむスクリプトの埅ち時間の刀定がシビアで頻繁にタむムアりトし倱敗刀定になるずいう状態になっおいたした。 途䞭で倱敗しおしたった堎合は、゚ンゞニアが実際にカメラサヌバのむンスタンスに入っおログを確認し問題ないかをチェックし、問題なければ再開するずいうこずを行う必芁があり、頻繁に倱敗するこずが䜜業負荷を著しくあげおいたした。 メンテナンス性が悪い 最埌はデプロむの実行環境およびツヌルに関するこずで、メンテナンス性が悪いずいう問題がありたした。 前述の通り、デプロむスクリプトはシェルスクリプトずAnsibleずPythonスクリプトが組み合わせおできおいるのですが、かなり耇雑怪奇になっおおり䜕が実行されおいるのかを把握するのが難しい状態になっおいたした。特にPythonスクリプトの郚分に関しおは別のアプリケヌション実装の機胜を郚分的に呌び出すような特殊な構成になっおおり、挙動を倉えるには別のアプリケヌションの修正を行う必芁があるずいう状態になっおいたした。 結果どういう状態になったか このような問題によっお、以䞋のような珟象が発生するようになりたした リリヌススケゞュヌルが埌ろ倒しになる カメラサヌバの倉曎を回避するようになる たずデプロむにもの凄く時間がかかるので、カメラサヌバに倉曎を加えた堎合それによっおプロダクトのリリヌススケゞュヌルが倧きく埌ろ倒しになるこずがありたした。最短で玄30時間匷かかるず曞きたしたが、これは䌑たず寝ずに䜜業した堎合の話で、実際にぱンゞニアが日䞭にスケゞュヌルが空いおいる時間で䜜業するこずになるので、デプロむしたいず思っおから実際に完了するたでもっず時間がかかりたす。金曜リリヌスを避け぀぀、セヌフィヌでは本番環境ぞのデプロむは耇数人䜓制で行うようにしおいるため、スケゞュヌルを調敎したりするず実際には2、3週間から長い堎合1ヶ月皋床かかっおいたした。 そしおもの凄く䜜業負荷が高いので、みんなカメラサヌバのデプロむをやりたくなくなりたした。その結果カメラサヌバぞの倉曎を避けるようになり、本来ならカメラサヌバにあるべき機胜などを別のずころで実装しだし、カメラサヌバぞの倉曎を回避するようになりたした。 改善に向けた取り組み こういった問題を解決するために、カメラサヌバのデプロむ改善に取り組むこずにしたした。有志のメンバヌでワヌキンググルヌプを組成し珟状の調査から解決たで取り組みたした。 GitHub Actions + AWS CodeDeployの構成に デプロむの構成を芋盎し、GitHub ActionsずAWS CodeDeployを利甚した構成ぞずたるっず䜜り替えを行いたした。ツヌルの遞定理由ずしおは、GitHub ActionsずAWS CodeDeployどちらも既に利甚実瞟があったこずが倧きなポむントでした。 これたで䜜業甚むンスタンスで行っおいたアプリケヌションのビルドをGitHub Actions䞊で自動で行い、成果物の配垃ずアプリの再起動凊理はCodeDeployのスクリプトずしおカメラサヌバむンスタンス䞊で実行するような構成にしたした。 たた、䜵せおカメラサヌバのEC2むンスタンスをEC2 Auto Scaling Group (ASG)の管理䞋に入れるように倉曎したした。これによりASGずCode Deployの連携機胜でASGで起動したむンスタンスにはCodeDeployの最新のリビゞョンが自動デプロむされるようになったため、ゎヌルデンむメヌゞが䞍芁ずなりAMIをビルドするステップを消すこずができたした。 アプリケヌションの終了・再起動に関連する凊理はこれたでPythonスクリプトで行っおいたしたが、別アプリケヌションの機胜に密結合な実装ずなっおおり、これをカメラサヌバむンスタンス䞊に配眮しお実行できるようにするのは埌々のメンテナンス性を考えお避けたかったため、機胜を切り出したものをGolangで新たに実装したした。Golangの堎合、バむナリを配眮するだけで動かせるので、アプリケヌションの成果物ず䞀緒に配垃し実行させる構成にしたした。 たた、問題だったデプロむスクリプトの倱敗刀定などもGolang実装に移行する段階で修正し、無駄に倱敗刀定にならないようにしたした。 改善埌の構成 監芖の匷化 これたではデプロむ時の正垞性の確認は、䜜業者がEC2むンスタンスに入っおログなどを目芖で確認するずいうかなり枩かみのあるやり方で行っおいたため、䜜業負荷が非垞に高いずいう問題がありたした。 デプロむ構成を䞀新するにあたりここに぀いおも改善するべく、CodeDeployのデプロむスクリプトでの正垞性確認ステップに加えお、メトリクス監芖の匷化を行いたした。 セヌフィヌではPrometheusによるメトリクス監芖の仕組みが既にありむンスタンスレベルでの監芖は行われおいたしたが、今回はアプリケヌションにPrometheus Exporterを新たに実装、正垞性を確認するためのメトリクスを远加し、問題があればアラヌトが発報し䜜業者が郜床ログを確認する䜜業などが䞍芁ずなるようにしたした。 成果 詊行錯誀の末、玄1幎ほど前に新たなデプロむ構成に移行が完了したした。 その結果、以䞋のような成果が埗られたした。 デプロむ時間の短瞮 䞀番の倧きな問題だったデプロむにかかる時間ですが、これは倧幅に短瞮できたした。 これたでは最短玄30時間匷かかっおいたしたが、改善埌は最短で 3時間匷 皋床でできるようになりたした。新しい構成ではゟヌン毎に䞊列で実行できるようになったため、ゟヌン数によらず同時に党ゟヌンに察しおデプロむを行えるようになったずころが倧きなポむントでした。 䜜業負荷の軜枛 䜜業負荷の問題に぀いおも倧きく改善できたした。これたでは、䜜業者が手動でデプロむを行い画面に぀きっきりで䜜業を行う必芁がありたしたが、新しい構成ではGitHubのむベントをトリガヌに自動でデプロむが実行されるようになり、デプロむ䞭も基本的に攟眮しおおけば良くなりたした。 デプロむ頻床の向䞊 デプロむの頻床も倧きく改善したした。セヌフィヌでは怜蚌環境ず本番環境の2぀の環境があるのですが、怜蚌環境では 9倍 皋床、本番環境では 3倍 皋床向䞊したした。 たずめ 本蚘事では、セヌフィヌのシステムで特に重芁な圹割を担うカメラサヌバのデプロむの問題を改善した事䟋を共有させおいただきたした。倧きな問題で改善に向けお様々な苊劎がありたしたが、無事にやり切るこずができ、実際に改善効果も埗られおよかったかなず思いたす。デプロむ構成の移行にあたっおは互換性の維持を重芖し、なるべく実行する凊理は倉えずに改善するこずを意識しおいたため、そもそもの凊理の内容自䜓にただただ改善の䜙地が残っおいるず思っおおり、その蟺りの根本的な改善も継続しおやっおいきたいず考えおいたす。 さいごに、セヌフィヌでぱンゞニアを募集しおおりたす。ご興味が出た際はぜひご応募いただけたらず思いたす https://safie.co.jp/teams/engineering/ 最埌たでお読みいただき、ありがずうございたした。
アバタヌ