こんばんは、座禅いぬです。
生成AIの話も楽しいんですが、普段は地道に業務アプリ書いたりデータ分析して業務改善を頑張っております。今週は画像ファイルを管理する作業していたのでその忘備録です。
先人がすでにいろいろな記事を書いてくれていますし、自分なりのアプローチとしてなるべく平易な単語使って説明をしてみたいと思います。
大量に氾濫する画像をどうやって管理したらいい?
今取り組んでいるのは画像分類タスクです。私の職場では毎日たくさんの画像データが発生します。iPadのカメラや一眼レフカメラから、やたらでかい手術用顕微鏡や細菌を見る顕微鏡まで様々な機器で写真を毎日撮り続けています。めんどくさいのは、撮る機材も撮る人間も様々であるということです。
今まではそれを各機材ごとに保存していたのですが、機械学習させることも考えるようになったので、一元管理する仕組みを作ろうと考えるに至りました。そこで、今回はAWSのS3バケットを使って仕組みを構築してみました。
S3バケットを使うメリット
では、なぜAWS S3を使うといいのか?を一般論ではなく自社のケースに当てはめて考えてみたいと思います。
-
拡張性と管理のシンプルさがありがたい
S3はほぼ無制限に容量を増やせるため、社内で増え続ける画像データに対応しやすいです。自社内でHDDやサーバー立ててデータを管理するのはとてつもなくめんどいです。毎回AmazonのタイムセールのたびにHDD買い足すのはもううんざり。そもそも誰が管理するのか決めるだけで大変です。S3なら自動的に増やせるので、管理する手間が激減です。 -
耐久性・可用性が高い
S3は、データが失われるリスクを最小限に抑えられ、ハードディスクがぶっ飛んでつらい思いをする可能性がかなり下がります。でもそれ以上にありがたいのは様々なクライアントから同時に呼びだしたり、書き込みをする自由度が高くなることです。 -
コスト効率の良さ
サーバーによる情報管理の仕組みを格安で得られます。また、長期保存を目的としたサービス(Glacierなど)もあるので、例えば「保管義務があるから長期保存しておかないといけないけど、アクセスはたぶんしないな…」みたいな画像などを安価に保管できます。 -
他のAWSサービスとの連携で安全に管理できる
S3はAWS LambdaやSageMaker、EC2などと連携性が高いです。AWS内ですべて完結できれば、安全性も担保しやすいはず。画像分類や解析を行うときに、S3に画像を置いておけば仕組みを構築しやすいわけです。自動化も簡単。S3に新規画像がアップされたら自動的にLambdaを実行し、メタデータをデータベースに登録する…など色々できます。す。
実際にどうやって管理しているのか
現在のところ、以下のような方針でS3を使って画像を管理しています。
-
画像保管方法の設計
「どの機械、規格に紐付く画像なのか」を一目で把握できるように、フォルダを分割することが可能です。ファイルの格納ルールを明確化することで探しやすくできます。flaskだったらファイル名の命名ルールを決めるともっと管理しやすい。 -
バージョン管理の活用
バケットのバージョニングを有効にすることで、うっかり画像を上書きしたり削除しても、過去バージョンから復元できるようにしておくことができます。 -
(応用編)Lifecycle管理
これはちょっと応用的な話ですが、頻繁にアクセスされる画像は標準ストレージ(Standard)に置き、古い画像はIntelligent-TieringやGlacier Deep Archiveへ自動的に移動するようLifecycleポリシーを設定。必要なときは復元リクエストを送ることで取り出せるため、コストとアクセス性のバランスを調整できます。
どうやって機械学習に活かす?
画像をS3で一元管理できるようになると、機械学習へ取り組みやすくなります。
-
データセット作成が容易に
バケットを横断して同じクラスラベルの画像をまとめる、撮影日ごとに画像を分割するなどの前処理が一箇所で済むようになります。メタデータを紐付けしておけば、ラベル付け作業もスムーズに行えます。
一つの場所に管理できるからこそ、「モデルの修正していて、撮影方法を変えることになった」などのいろいろな変更に対しても管理が行いやすいですね。 -
ETLパイプラインとの連携
AWS Glueや自前のスクリプトを組むことで、アップロードされた画像を定期的にスキャンし、必要なラベル付けやデータ変換(リサイズや圧縮など)を自動化できます。モデルの再学習や推論パイプラインへ素早くつなぐことが可能です。 -
様々なAIサービスと組み合わせ
Amazon Rekognitionで物体検出やOCRをかけたり、SageMakerで独自モデルを作り込んだりする場合も、元データがS3に集約されていれば読み取りやすく処理コストも抑えられます。
何がめんどくさいってGPUを使った作業を自動化するのはとっても大変なのですが、AWSで仕組みを作ればシンプルに設計・管理できます。
運用してみてわかったポイント
-
アップロード・ダウンロードのエンドポイントを固定する
セキュリティ上も大事な話で、エンドポイントを絞っておくことでデータの通り道がどこなのかクリアにしておくとよいです。 -
ラベル付けのルール作り
人間がどこまで手作業でラベルを付けるかを考えないといけないです。Flaskで設計する際に、どの機械からアクセスしたらどのようにラベル付けされるかまでしっかり作りこんでおくとミスが少なくて済みます。後で修正するのはとっても大変です。 -
コストモニタリング
大量の画像をアップロードすると、意外と保存コストや転送料がかさむことがあります。タグ付けやバケット単位でコストを監視し、月ごとに確認する運用を回すと安心です。
まとめ
今回はAWS S3を使った画像管理の事例やメリットをご紹介しました。撮影機器や担当者がバラバラでも、一元管理することで「どこに何があるのか分からない」という混乱を防ぎ、機械学習のデータセット作成や分析作業もぐっとやりやすくなります。
画像が肥大化していく環境下ではクラウドの拡張性が非常にありがたいですし、すぐに別のAIサービスと連携できるのもAWSを使う大きな利点です。今後は機械学習パイプラインへの自動連携や画像の高度な検索機能、自動的に仕分けしてラベル付けする仕組みなどを強化していく予定なので、また何か進展があればブログにまとめたいと思います。
以上、今週やってたことの忘備録でした。次回は、実際SageMakerを動かすところまでやってみようと思います。
ここまで読んでくださり、ありがとうございました!