2023年頃から生成AIが劇的に進化して、それまでプログラマコミュニティで文章生成や画像生成AIプログラミングをしていたことがバカらしくなるくらいになってしまった。生成AIについては賛否両論あり、私個人としては100%賛成というわけでも逆に100%反対の立場でもない。包丁と同じで、用途や利用者の倫理観に左右されるものだと認識している。

生成AIが普及したとはいえ、生成AIを利用することだけがすべてではない。取組む問題によっては対話型生成AIのような高級なインタフェースを持たなくても、例えば遺伝的アルゴリズムやAkinatorのようなエキスパートシステムでいいかもしれない。

ここでは前職でもAI技術の取組みが必要ということで、当時新規技術開発を担当していたときに作ったシステムを備忘録がてら載せる。

注意

内容にはフェイクが含まれているので、この内容をそのまま受け取らないでください。この話も登場人物もすべてフィクションで、実際の案件とは関係がありません。

同僚はそこにいるか?

当時はディープラーニングへの期待が大きかったので、AIプログラミングに取組み始めたときに始めて取組んだ題材がこれだった。MNISTのような初心者用データセットもあるが、実際有用であることを示すには現実の問題に対して取り組まなければならないので、自分でいちからデータセットを作ることにした。

そこで自宅にあったWebカメラを持ち込んで、同僚が座っている姿を撮影することにした。これはPythonとOpenCVライブラリで実装したもので、数分おきに画像を取得してストレージに保存をかけ続けた。

数日経過したところで十分なデータが揃ったので、同僚が席に座っているものと座っていないものを同数になるように仕分けた。はじめてのことだったので、画像数も数千くらいにしてKerasを使って学習させた。会社から割り当てられていた端末は機械学習用のグラフィックスボードを積んだものではなかったので、そこそこ時間こそかかりはしたものの、無理のない範囲だった。

最終的な精度は96%程度で、例外ケースが難しいとか、精度を上げるためのデータクレンジングが大変だったとか、余分なデータを排除するとかに苦心したことを記憶している。しかし、社内勉強会でこういうことができると発表したところ、反応はおおむね好評だった。

欠陥抽出への応用

小手先システムの破綻

当時の前職では、ある工場が製造する部品の欠陥を抽出する案件を受注・保守し続けていた。開発したのは私より約20歳ほど上の課長補佐で、古典的な画像処理を使って欠陥らしき部分を抽出するような仕組みであった。作られた時代背景もありC++で書かれていたが、本人も解決できないアルゴリズム上の限界とメモリリークする欠陥があって保守には苦労していた。

先方の要求水準としては欠陥検出率90%であったが、条件によってはこれを下回ることもあり、システムの周辺機器の交換時にメンテナンスと称して小手先のパラメータ調整を行なっていた。これは必要な作業ではあったが、2~3時間以上に及ぶことがあり、本人しかメンテナンスできない以上、黙って見守るしかなかった。あとから聞くに、どうやら初期導入時には裏機能を駆使して検査を乗り越えたらしく、実際の性能は要求水準を満たしているか怪しいところであった。ただ、見込める売上げが高かったために、会社的にもなにをしてでも受注したい案件でもあったので文句は言えなかった。

AIでの置換え

私が入社してから4年ほど経ったころ、その課長補佐は抜擢人事により異動になってしまい、R主任と私が案件を引き継ぐことになった。取引先の工場の規模も大きくなり、欠陥抽出システムも導入件数が増えていった。引継ぎの際にソースコードを確認してみたが、コード中にコメントもなく、なにをやっているのかもおおよそ程度にしかわからなかったし、肝心の課長補佐も引継ぎをすると言っていたが、するする詐欺で逃げられてしまった。とはいえ、実績はあるので私たちは塩漬けにされたプロジェクトを現場に出荷するだけでよかった。

問題が起きたのはそれから2年くらいしてからだった。先方の担当者が代わり、我が社の欠陥抽出精度が低いのではないかと言われるようになってしまった。先方の工場では同時に何社かのシステムを導入しており、我が社の性能がとりわけ低いのだと言う。あとから聞くにデータを提示されたわけでもなく、仕様を満たしてはいたらしいのだが、なにか思惑があったのか、説明と性能改善を求められた。

2回ほどR主任が説明に向かったが、担当者も技術に詳しい人間だったそうで、相当弁の立つR主任でさえもやり込められてしまい、「AIを導入して精度を向上させます」と言わざるを得なくなってしまった。R主任は社に帰ってくるなり私に「AI(ディープラーニング)でこの問題を解決できないか?」と持ちかけてきた。こうして私が作った「同僚のあるなし判定」のシステムは姿形を変えて欠陥抽出のシステムに応用されるようになった。

お遊びが製品に

R主任の口振りから察するに、失敗は許されない案件となってしまったので、とにかくデータをかき集めるところから始めた。さいわい画像データはたくさんあったので、まずは画像の切出しをするスクリプトと欠陥のあるなしをラベリングするツールを作った。前者はPythonで、後者はC#で作成した。

教師データを数万用意するために、私と後輩の2人で数日間業務時間のほとんどの時間を割いてラベリングし続けた。R主任も忙しい業務の間に手伝ってくれた。大義名分ができたので50万円くらいの機械学習用端末も購入してもらった。GPUの力は凄まじく、学習が何十倍も速くなったのは正直驚いた。

数万のデータを飲み込んで作られた学習モデルの正答率は今までの古典的画像処理によるアルゴリズムによる欠陥抽出が馬鹿馬鹿しく思えるくらいには高かった。手元のデータで検証する限りは98%の正答率だった。社内もこの結果に沸いた。私も納品のために現地に行くのが楽しみであったし結果も大成功だった。そしてこれが前職での最後の仕事となった。今は後輩がメンテナンスを続ける傍らで、さらなる性能向上を図っていると聞く。

会社で冗談半分で遊んでいたものが本当に製品になってしまった。IPAの登(のぼり)氏が言うように、「けったいないたずら」や「けしからん行動」が本当の知識と能力に繋がるのではないかと感じることもある。

デジタル温度計を読み取る

前職では夏場に28℃になったらエアコンの電源をつけるというルールがあった。これは申告制で、事務所が暑いと思った人間が温度計の表示を見て、28℃以上であればエアコンの電源を入れる宣言をするというものだった。

ある日、私はこれをけったいないたずらの一環で、省力化のために28℃に到達したことを自動的に確認できるシステムを作りたくなった。28℃であることを判定するには別にデジタル温度計である必要もなく、組込み用のBME280のような温度モジュールもあるが、証拠を示すために人間が確認できることが重要なので、必然的にデジタル温度計の表示をWebカメラで読み取って、学習済みモデルで判定することにした。

これまで書いてきたようにディープラーニングはなんといってもデータが必要になる。冷水や熱湯を使って温度計の表示を色々と変えてデータを集めた。係長は今に始まったことではない私の不審な行動を見て見ぬふりをしていた。

しかし、仲のいい基板屋のS主任は、私になにをしているのかと尋ねてきた。私はこれこれこういうことを企んでいると伝えると、なにか面白く感じるところがあったのだろう、そのいたずらに乗ってくれた。そしてどこかから掘り出してきたパトランプを持ち出してきて、Raspberry PiのGPIOと繋がるようにしてくれた。こうして28℃検知システムは1週間ほどで完成した。やっぱりIoTはソフト屋だけでも基板屋だけでもうまくいかず、ふたつが合わさることで加速度的に物事が進むのだ。

ついに設置の日が来た。電源をONにしてから私は業務を開始した。徐々に上がる室温。そして午前10時半、ついに28℃検知システムが動作した。リレーのカチンという音が鳴るや否やフロアの端まで赤いパトランプの鋭い光が届いた。みんなが何事かと思っている中、すぐさま課長がやってきて口を開いた。「おい!これってエアコン入れろってことだろ?wそうだろ?w」さすが課長、意図を理解している。そのままエアコンの電源を入れて去っていった。

隣の部署の課長補佐からは怒られた。「そういうことは許可をとってからやりなさい!」確かに、許可を取らなかったのは私の落ち度ではあるし、謝罪もした。ただ、それではいたずらではないではないか。初日でこのシステムはお蔵入りになったが、こうした遊びにも寛容だった職場であったことには感謝している。

遺伝的アルゴリズム

私は遺伝的アルゴリズムが好きである。なによりシンプルであるし、簡単にそれっぽい答えが得られる。コードが少なくて済むしフルスクラッチでもどうにかなる。学習データも数GB級にならず空間的にも優しい。反面調整が難しく局所解に陥りやすい。また、エミュレートする環境も必要になるのでシステムを自動化するか、APIによって自動的に制御できるように設計しておかなければならない。

もちろん仕事においてもどこかで遺伝的アルゴリズムを応用できないかと考えていたが、ついぞ実現はしなかった。IoTデバイスに代表される小型の機器であれば実用できる余地はあるのかもしれない。

プレイしたことはないが、アストロノーカでは敵が同じ戦略に引っかからないように学習していくようになっているし、グリムノーツでも現実的な時間内で最強パーティを探索する用途に使用している。特にアストロノーカではPlayStationの2MBのメインメモリで実現しているのだから驚きだ。