社内ハッカソン 開催レポート
時間と場所
項目 | 詳細 | 備考 |
開始時間 | 2022年5月3日09:30 | |
終了時間 | 2022年5月4日 20:00(打ち上げ含む) | |
場所 | Dep. | 兵庫県神戸市中央区1 中央区三宮町3-1-16 三星ビル4階南室 |
宿泊について | 必要に応じて各自で手配ください。 | |
食事 | 基本各チームごとにとってください。 | |
タイムスケジュール
項目 | start | end | 備考 |
初日開場 | 9:00 | ||
チェックイン | 9:30 | 自己紹介など | |
ハッカソン説明 | 9:40 | 10:00 | |
チーム編成〜作業開始 | 10:00 | 13:00 | チーム名とテーマを決めて役割分担を行います。 |
ランチ | 13:00 | 14:00 | 全員で |
終日 | 特に時間は決めていません。 (徹夜してもらってもOKです 冗談) | ||
2日目開場 | 9:00 | ||
中間発表 | 9:30 | 10:00 | |
チームで作業 | 10:00 | 17:00 | |
成果発表とチーム表彰 | 17:00 | 18:00 | 互いに評価し合う形式です。スクラムサインの広報ブログに記載予定。 |
打ち上げ | 18:00 | 19:30 | 場所はDep.にて行う。 |
片付け、チェックアウト、解散 | 19:30 | 20:00 | 室内の清掃含む |
打ち上げ時の軽食および、ドリンクは会社サイドで用意します。
参加
小島さん 青木さん 北村
加藤さん 辻田さん 鳥居さん 野中さん 藤岡さん
ゲスト参加
KaiRA(京都大学 人工知能サークル)より 三宅さん
チームごとの成果
◼️UUUトリプルユー
テーマ
ビデオ会議において、マスクを着用した参加者の映像を、マスクを外した状態の映像に自動変換するシステムの作成。
顔を映すコミュニケーションツールにおいて、やはりマスクを着用していない方が本当の顔がわかってコミュニケーションが取りやすい。しかし実際にマスクを外すことができない状況もあるため、ニューラルネットワークでの画像変換を用いてマスク除去を行った。
手法
大まかな流れとしては、①映像からの顔切り出し、➁マスク部分の黒塗り、③黒塗り部分を補間する画像変換、④変換顔を元の映像にはめ込む、の4工程でマスク除去を行った。
①映像からの顔検出
顔検出では(A)autocrop、(B)SSD+Dlib、(C)MTCNNの3種類のライブラリを検討した。ここでの顔検出とは、顔を切り出した上で両目が水平になるように切り出し画像を回転させる操作のことである。(A)はマスクなしの顔検出ライブラリのため、マスク顔の検知が難しかった。(B)はマスク顔対応のモデルで、Dlibでは自分らでアノテーションを施し、目口の検出を学習させた。しかしDlibの精度が低かった。(C)はCNNベースのマスクなし顔検出ライブラリだが、マスクあり顔も検出できた。最終的に(C)の精度が最も良いと判断し、(C)を採用した。
➁マスク部分の黒塗り
当初はHSVの値を用いて白マスクの部分を抜き出そうとしていたが、背景も抜き出されてしまった。rembgという背景除去ライブラリを組み合わせた場合も、背景と同時にマスクも抜き出されてしまい上手く分離ができなかった。最終的には検出した顔領域の下半分をすべてマスクと仮定し、黒塗りすることにした。
③黒塗り部分を補間する画像変換
顔画像の黒塗り部分を補間するニューラルネットワークであるCo-Mod-GANを使用した。これがTensorflow1.15で実装されており、ローカル環境やRaspberry Piでの環境構築が難しいとわかった。その後PyTorchでの別実装を見つけたため、それを用いてローカル環境やRaspberry Piでも動作するようにした。
④変換顔を元の映像にはめ込む
①では顔切り出し→回転→リサイズを行っていたため、その逆リサイズ→逆回転→顔ペーストを行って元の映像に変換顔をはめ込んだ。
手法のイメージ図

当初は①-④すべてGoogle Colaboratory上で動かしていたが、最終的には①-④すべてをノートPC上とRaspberry Pi上でも動かすことができた。またColaboratory上でgradioというライブラリを用いてAPIサーバーを構築し、ノートPCからAPIを呼び出して動作させることもできた。
今後の課題
zoom等で使用するにはリアルタイム処理が必要不可欠だが、現状は動作速度がかなり遅い。解決案としてはサーバーとのやり取りを高速化することが挙げられる。今回用いたgradioはリアルタイム処理を目的としていないため、動画配信用のサーバーライブラリであるffserverや、webrtc方式に対応しているstreamlitを代わりに使用することで高速化が可能になる。
また、変換顔が実際の本人のマスクなし顔と同じになるとは限らないという問題点もある。これはCo-Mod-GANで潜在変数を操作することで変換顔を本人の顔に近づけることが可能になる。
Raspberry Piで動作している様子

zoomで使用している様子
使用ライブラリ
- Face-Mask-Detection (SSD) https://github.com/chandrikadeb7/Face-Mask-Detection
- facenet-pytorch (MTCNN) https://github.com/timesler/facenet-pytorch
- co-mod-gan https://github.com/zsyzzsoft/co-mod-gan
- co-mod-gan-pytorch https://github.com/zengxianyu/co-mod-gan-pytorch
- gradio https://gradio.app/
◼️シンプルお役立ちアプリケーション工房
行ったこと
一言で言うと、自己紹介と近況交換を円滑にするコミュニケーションBot
なぜ自己紹介と近況交換なのか?
コミュニケーションは大切。でもSlackだからリアルとは違う。
紹介は一番コミュニケーションのスタートになろころだから、いままでの自己紹介をアップデートする必要がある。
どのような課題に対して取り組んだか?
様々な時間帯で働くメンバーがSlack上で挨拶を行うと、メンバーからすぐに返信がこず、不安になる。メッセージに埋もれて気づかない。(自己紹介のし忘れがある)
どのようにその課題を解決したか?
自己紹介をみつけると反応して即座に自分の代理として自己紹介を返す(つまり盛り上がる。)
自己紹介した相手とリンクを自分にDMしてくれる。
あと、定期的にランダムに選んだメンバーに最近の近況をきいてくれます。自己紹介のリアクション時にそれを加味した自己紹介文を自動生成してくれます。
キャラクター設定
実際のイメージ
◼️すくらむさいん
取り組んだこと
総当たり攻撃、辞書攻撃を使いWiFiのパスワードを当てることができるか検証。コマンドからWiFiの接続を試みたが、Ubuntuでは以下のようなポップアップがパスワードを間違う度に出てきてしまいパスワードを当てることに失敗。

Python, Rustでの実装
WiFiに接続するところまでの処理を実装し、処理速度を比較
以下のようにあるパスワードを入力し、総当たり、またはオープンソースのワードリストを用いて入力したパスワードを当てるまでの時間を計測。
計測では以下のワードリストを用いてある文字列に到達するまでの時間を計測
計測結果
Please input password. 150201 ⠏crackingno.732320 found 150201 ✔ cracking
149.306584ms
スレッド数 | Python | Rust |
1 | 149.306584ms | 249.923791ms |
2 | *118.922209ms | 未計測 |
備考
- Rustの並列処理での計測は実装が間に合わず未計測
- Pythonの並列での処理はワードリストを予め2つに分割して計測
WiFiへの接続
Rustでは以下の2種類の方法がある。
- 以下のコマンドをRustから実行して接続
- wifi_rsライブラリを使用
どちらの方法でもUbuntuで実行しパスワードを間違えた場合、上述の通りポップアップが表示される。
リポジトリ
参考