AutoML Vision을 사용하여 고막 이미지 판별 Bot 만들기

개요



평상시는 이비과의 개업의를 하고 있습니다.
이번 AutoML Vision에서 작성한 고막 화상 분류 모델을 사용한 고막 화상 판별 Bot를 만들어 보았습니다. Bot가 진단하는 것은 법적으로 좋지 않기 때문에 공개는 하지 않을 예정입니다만, 이름은 고막 운세 봇이라고 하기로 했습니다(점자라면 좋을 것 같기 때문에).

전회까지의 기사는 이쪽
GCP Cloud AutoML Vision을 사용한 고막 이미지 분류
Node.js에서 AutoML Vision의 고막 이미지 분류 모델을 사용해보십시오.

완성 동영상



AutoML을 사용한 고막 운세 Bot 피 c. 라고 r. 이 m/ゔぇ3d3Bj5K — 질병의 자체 검사 (@Selfcheckhealt1) March 20, 2020


개념도





만들기



1. 필요한 패키지 설치



npm install --save fetch-base64


2. 프로그램 만들기




aombot.js

'use strict';
require('dotenv').config();
const fetch = require('fetch-base64');
const express = require('express');
const line = require('@line/bot-sdk');
const PORT = process.env.PORT || 3000;

const config = {
  channelSecret: "自分のチャンネルシークレット",
  channelAccessToken: "自分のアクセストークン"
};

const automl = require('@google-cloud/automl');

// Create client for prediction service.
const mlclient = new automl.PredictionServiceClient();

const projectId = "自分のプロジェクト名";
const computeRegion = "us-central1";
const modelId = "自分のモデルID";
const scoreThreshold = "0.5";

// Get the full path of the model.
const modelFullId = mlclient.modelPath(projectId, computeRegion, modelId);

const aomLabels = {
  "aom": "急性中耳炎",
  "ome": "滲出性中耳炎",
  "normal": "正常鼓膜",
};

const app = express();
app.use(express.static('public')); //追加

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)


app.post('/webhook', line.middleware(config), (req, res) => {
  console.log(req.body.events);

  //ここのif分はdeveloper consoleの"接続確認"用なので削除して問題ないです。
  if (req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff') {
    res.send('Hello LINE BOT!(POST)');
    console.log('疎通確認用');
    return;
  }

  Promise
    .all(req.body.events.map(event => handleEvent(event, req)))
    .then((result) => res.json(result));
});


const client = new line.Client(config);

async function handleEvent(event, req) {
  console.log(req);
  if (event.type !== 'message' || (event.message.type !== 'text' && event.message.type !== 'image')) {
    return Promise.resolve(null);
  }
  const params = {};
  params.score_threshold = scoreThreshold;

  // Read the file content for prediction.
  const data = await fetch.remote({
    url: `https://api-data.line.me/v2/bot/message/${event.message.id}/content`,
    headers: {
      'Authorization': `Bearer ${process.env.CHANNEL_ACCESS_TOKEN}`
    }
  });

  const payload = {};
  payload.image = { imageBytes: data[0] };

  // params is additional domain-specific parameters.
  // currently there is no additional parameters supported.
  const [response] = await mlclient.predict({
    name: modelFullId,
    payload: payload,
    params: params,
  });



  if (response.payload.length === 0) {
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: `ちょっとわかりませんね・・・`
    });
  }
  return client.replyMessage(event.replyToken, {
    type: 'text',
    text: `出ました!占いではあなたの耳は${aomLabels[response.payload[0].displayName]}と出ています。`
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);




.env는 여기



GOOGLE_APPLICATION_CREDENTIALS=./ダウンロードしたJsonファイル名 
CHANNEL_ACCESS_TOKEN=自分のチャンネルアクセストークン


고찰



AutoML Vision에서 작성한 고막 화상 분류 모델을 사용한 고막 화상 인식 Bot을 작성할 수 있었습니다. 실제로 테스트하면 급성 중이염·삼출성 중이염·정상 고막의 판별은 90% 정도의 정답률이었습니다.

처음에는 신뢰도(0~1 사이의 숫자로 표시됨)도 동시에 표시하려고 했는데 아래의 이 사진처럼 고막 이외의 사진을 보냈을 경우에도 높은 신뢰도(아래 사진 그러면 1)이 표시됩니다.



이 모델은 급성 중이염과 삼출성 중이염과 정상 고막의 세 가지 태그만으로 고막 이외의 이미지를 교사 데이터로 등록하지 않았기 때문입니다.

실용성을 요구한다면 1단 회째로서 고막 화상 검출을 실시(여기에 고막 이외의 교사 데이터를 넣는다), 2단계째로서 중이염의 판정을 실시하는 구성이 필요하다고 생각되었습니다.


좋은 웹페이지 즐겨찾기