𧌠AIã§å€å®ãæž æããæããã§ãã¯!? Teachable Machine à Webã«ã¡ã©ã§è¡ç管çããŒã«ãäœã£ãŠã¿ã
ããã«ã¡ã¯ïŒ
ã¹ãŒããŒã§å¯åºé·ãããŠãããšããããšç³ããŸãã
ä»åã§Qiitaæçš¿ã¯4åç®ã«ãªããŸãã
ð± è¡ç管çãå¯åºé·ã®å€§äºãªä»äº
ç§ã®è·å Žã§ã¯ãå¯åºé·ãè¡ç管çã®è²¬ä»»è
ãåããŠããŸãã
ãã®ãããæ¯æ¥ãéèããèããéããæ£èããªã©ã®çé®®éšéã®äœæ¥å Žãå·¡åããæž
æç¶æ³ããã§ãã¯ããã®ãæ¥èª²ã
ã§ããããæã£ããã§ãã
ãããAIã§èªååã§ãããæ¥œãããªãïŒ
ããã§ä»åã¯ãTeachable Machineã䜿ã£ãŠãæž æã®ååŠå€å®ããŒã«ããäœã£ãŠã¿ãŸããïŒ
ð ã©ããªããŒã«ãªã®ïŒ
宿ããã®ããã¡ãð
ã¹ããã®ã«ã¡ã©ã§æž æå¯Ÿè±¡ãæ ããšã
- åæ ŒïŒãããïŒ
- äžåæ ŒïŒãŸã æ±ããŠãïŒ
ãèªåã§å€å®ããŠãããŸãã
äžåæ Œã ã£ããæé€ãããçŽããåæ ŒåŸã«ãã§ãã¯ãªã¹ãã«èšé²ããä»çµã¿ã§ãã
𧪠䜿çšããæè¡
ð§ äœææé ãŸãšã
ã¹ãããâ ïŒTeachable Machineã§æž æç¶æ ãåŠç¿ããã
- Teachable Machineã«ã¢ã¯ã»ã¹
- ãImage Projectããéžæ
- å€å®å¯Ÿè±¡ïŒäŸïŒé»åã¬ã³ãžã»å£ã»ææ°æã»å·èµåº«ïŒã®
- åæ ŒïŒæž ææžïŒ
-
äžåæ ŒïŒæ±ããŠãïŒ
ã®åçãããããæ®åœ±ã»ã¢ããããŒã
- ã¢ãã«ããã¬ãŒãã³ã°
- ããšã¯ã¹ããŒããâãã¢ããããŒããâãJavaScriptã³ãŒãããã³ããŒ
ã¹ãããâ¡ïŒWebã«ã¡ã©ãšé£åããWebã¢ããªãäœã
- CodePenãéã
- HTMLã«ã³ããŒããã³ãŒãã貌ãä»ãã
- ãStartããã¿ã³ã§ã«ã¡ã©ãèµ·åããããã«ãªããŸã
ã¹ãããâ¢ïŒã¹ããã§ã¢ãŠãã«ã¡ã©ã䜿ããããã«ãã
éåžžã¯ã€ã³ã«ã¡ã©ãèµ·åããŠããŸãããã
ã³ãŒãå
ã®äžèšã®éšåãïŒ
await webcam.setup();
次ã®ããã«å€æŽããŸãð
await webcam.setup({ facingMode: "environment" });
ããã§ãã¹ããã®ã¢ãŠãã«ã¡ã©ãèµ·åããããã«ãªããŸãïŒ
ã¹ãããâ£ïŒæž æãã§ãã¯ãªã¹ãã远å
æž æçµæãèšé²ã§ããããã«ããã§ãã¯ãªã¹ãæ©èœã远å ããŸãã
ãŸããHTMLã«ä»¥äžã®ã³ãŒãã远å ããŸãã
貌ãä»ãäœçœ®ã¯æ¬¡ã®ãããªã³ãŒãã®ããäžã§ãð
<div>Teachable Machine Image Model</div>
<button type="button" onclick="init()">Start</button>
<div id="webcam-container"></div>
<div id="label-container"></div>
ðãã®ã³ãŒãããã®äžã«è²Œãä»ããŠãã ããïŒ
<h3>â
ãã§ãã¯ãªã¹ã</h3>
<form id="checklist-form">
<label><input type="checkbox" name="item" value="é»åã¬ã³ãž"> é»åã¬ã³ãž</label><br>
<label><input type="checkbox" name="item" value="å£"> å£</label><br>
<label><input type="checkbox" name="item" value="ææ°æ"> ææ°æ</label><br>
<label><input type="checkbox" name="item" value="å·èµåº«"> å·èµåº«</label><br>
<button type="button" onclick="submitChecklist()">ãã§ãã¯å®äº</button>
</form>
<div id="checklist-result" style="margin-top:1em;"></div>
ç¶ããŠãJavaScriptã«ä»¥äžã®ã³ãŒãã远å ããŠãã ããð
function submitChecklist() {
const checkedItems = [];
const checkboxes = document.querySelectorAll('input[name="item"]:checked');
checkboxes.forEach((cb) => checkedItems.push(cb.value));
const timestamp = new Date().toLocaleString();
const resultDiv = document.getElementById('checklist-result');
if (checkedItems.length === 0) {
resultDiv.innerHTML = `<p style="color:red;">äœããã§ãã¯ãããŠããŸãã</p>`;
return;
}
resultDiv.innerHTML = `
<p>ð§¹ ãã§ãã¯å®äºïŒ</p>
<ul>
${checkedItems.map(item => `<li>${item}</li>`).join('')}
</ul>
<p><small>${timestamp} ã«èšé²ãããŸãã</small></p>
`;
}
ããã§ããã§ãã¯ãªã¹ãã«å®äºé
ç®ã衚瀺ããã
å®è¡æ¥æãèšé²ãšããŠç»é¢ã«æ®ãããã«ãªããŸãã
ð§ æ¬åœã¯ã¹ãã¬ããã·ãŒãã«èšé²ãããã£ãâŠ
æ¬åœã¯ããã§ãã¯çµæãGoogleã¹ãã¬ããã·ãŒãã«èªåã§èšé²ããããšèããŠããŸããã
ã§ãããããã§å€§ããªå£ã«ã¶ã€ãããŸãã
CodePenã§ã¢ããªãå®è¡ããŠãããšããããããªãšã©ãŒã衚瀺ãããŸããð
ChatGPTããã«ç¢ºèªãããšããã以äžã®ãããªä»çµã¿ã«ãªã£ãŠãããšã®ããšã
CodePenïŒ
https://cdpn.ioïŒãããGoogle Apps ScriptïŒhttps://script.google.com/...ïŒã«ããŒã¿ãéä¿¡ããããšãã
â
ãã©ãŠã¶ããå®å šãããªãéä¿¡ããšå€æããŠãããã¯
â
ãFailed to load resourceããšããèµ€ããšã©ãŒãåºã
ã€ãŸããCodePenããçŽæ¥GASã«ããŒã¿éä¿¡ããã®ã¯é£ããããã§ãã
æ¬åœã«ãããªã®ã§ããããïŒ
äœãããããã¯ããæ°ãããŸãâŠ
解決çãšããŠã¯ã
ãæåããGASã§Webã¢ããªãäœãã ãšããæ¹æ³ããããããªã®ã§ãçŸåšãã¡ããå«ããŠäžŠè¡ããŠæ€èšäžã§ãã
ðšâð©âð§ å®¶åºã§è©ŠãããåŠ»ãæ¿æïŒïŒè©Šäœã®ãªã¢ã«ãªææ³
ä»åãçŸå Žã®åçã§åŠç¿ã¢ãã«ãäœãåã«ããŸãã¯è©Šäœãã¹ããšããŠèªå®
ã®ãã®ã§äœæããŠã¿ãŸããã
ããã§ãå®éã«åŠ»ã«äœ¿ã£ãŠãããããšã«ããŸããã
-
劻ãæé€ããã®ã«âäžåæ Œâã£ãŠåºããçŽåŸãããªãã
ããéã«ãæ±ããŠãã®ã«âåæ Œâã«ãªãããšããããã
ããèšé²ãæ®ããªããæå³ãªãããããªãïŒã
ããããããæé€ã«ååŠãã€ãããããªããŠå«ïŒã
âŠãšããæãã§ãå®ã¯æåããæ©å«ãæªãã£ããã§ãã
ãšããã®ããç§ãäºåã«"æ±ããŠããå Žæ"ãæ®åœ±ããŠããããšããã¬ãŠããŸã£ãŠâŠã
ã§ãæ£çŽãªãšãããæ±ããŠããå Žæãæ¢ãã®ã¯æ¬åœã«å€§å€ã§ããã
ããã ããæ¥ãããããã£ããæé€ãè¡ãå±ããŠãããšããããšãªãã§ãããã
ç§ã¯æé€ãã»ãšãã©ããŠããªãã®ã§âŠåŠ»ã«ã¯æ¬åœã«æè¬ã§ã ð
ð åçç¹
- åŠç¿ããŒã¿ïŒç¹ã«äžåæ Œã®åçïŒãå§åçã«äžè¶³ããŠãã
-
æ±ããŠããç¶æ
ã®åçãæ®ãã®ãé£ãã
- â æé€ããŠããŸãããæ®åœ±ã¿ã€ãã³ã°ãéããã
- â è¡ççã«ããæ±ããæŸçœ®ã§ããªã
ð¬ æåŸã«
ä»åã®åãçµã¿ã¯ãçŸå Žã§æ¬æ Œçã«äœ¿ãã«ã¯èª²é¡ãå±±ç©ã¿ã§ããã
ãã ãå®éã«äœ¿ã£ãŠããã£ãŠèŠããããšããã£ããšããç¹ã§ã¯ã倧ããªäžæ©ã ã£ããšæããŸãã
ä»åŸã¯ã
- â ã¹ãã¬ããã·ãŒããžã®èšé²æ©èœã®å®è£
- â å€å®ã¢ãã«ã®ç²ŸåºŠåäž
ãç®æããŠãããã«ã¢ããããŒãããŠããäºå®ã§ãïŒ
ãããã¯ãããããïŒããšããã¢ããã€ã¹ãã¢ã€ãã¢ãããã°ã
ãã²ã³ã¡ã³ãã§æããŠããã ãããšããããã§ãð
ð§è¿œèš
èšäºãæçš¿ããåŸãããããªæ¹ã®èšäºãã¿ããããã£ã±ã飿ºããããšãã§ãããã§ãã
ããã§ãæ¹ããŠããäžåºŠChatGPTããã«èããŸããã
ãããšããã£ãã宿ããããšãã§ããŸããã
äœææ¹æ³ã¯ãã¡ã
â ã¹ãããâ ïŒã¹ãã¬ããã·ãŒãã®æºå
- Googleãã©ã€ãã§ãæ°èŠãâãGoogleã¹ãã¬ããã·ãŒãããäœæ
- ã¹ãã¬ããã·ãŒãã®ååããããããããæž æãã§ãã¯èšé²ããªã©ã«å€æŽ
- 1è¡ç®ã«ä»¥äžã®ããã«å ¥åããŸãïŒèŠåºãïŒ
| ãã§ãã¯é ç® | æ¥æ |
|---|
â»ãã·ãŒã1ããšããååã®ãŸãŸã§OKã§ã
- ã¹ãã¬ããã·ãŒãã®URLã«ãã ID ãã³ããŒããŠãããŸã
ãäŸïŒhttps://docs.google.com/spreadsheets/d/**ãããID**/edit#gid=0
â ã¹ãããâ¡ïŒGoogle Apps Script ã®èšå®
-
ã¹ãã¬ããã·ãŒãç»é¢ã§
ãäžéšã¡ãã¥ãŒãæ¡åŒµæ©èœãâãApps Scriptããã¯ãªã㯠-
以äžã®ã³ãŒãããŸãããšã³ããããŠãã ããð
function doPost(e) {
const sheet = SpreadsheetApp.openById("â
ããªãã®ã¹ãã¬ããã·ãŒãIDâ
").getSheetByName("ã·ãŒã1");
const data = JSON.parse(e.postData.contents);
sheet.appendRow([
data.checkedItems || '',
new Date()
]);
return ContentService.createTextOutput("èšé²ããŸããïŒ");
}
ð ãã€ã³ã
-
â ããªãã®ã¹ãã¬ããã·ãŒãIDâ ã®éšåããã¹ãããâ ã§ã³ããŒãã ã¹ãã¬ããã·ãŒãID ã«æžãæããŠãã ãã
-
getSheetByName("ã·ãŒã1") ã®éšåã¯ãã·ãŒãåãéãå Žåã¯ããã«åãããŠãã ããïŒéåžžãã®ãŸãŸã§OKïŒ
â ã¹ãããâ¢ïŒãŠã§ãã¢ããªãšããŠãããã€
- ã¹ã¯ãªããç»é¢ã®å³äžããããã€ãâãæ°ãããããã€ããã¯ãªãã¯
- ãçš®é¡ã®éžæãâããŠã§ãã¢ããªããéžæ
- äžèšã®ããã«èšå®ããŸãïŒ
- 説æïŒç©ºæ¬ã§ãOK
- 次ã®ãŠãŒã¶ãŒãšããŠå®è¡ïŒèªåïŒèªåã®Googleã¢ã«ãŠã³ãåïŒ
- ã¢ã¯ã»ã¹ã§ãããŠãŒã¶ãŒïŒãå šå¡ïŒå¿åãŠãŒã¶ãŒãå«ãïŒã
- ããããã€ããæŒããšURLã衚瀺ãããã®ã§ããããã³ããŒããŠãããŸã
ð ãã®URLããã¢ããªããã¹ãã¬ããã·ãŒãã«ããŒã¿ãéããéãå ïŒAPIïŒãã«ãªããŸã
â ã¹ãããâ£ïŒJavaScriptã«éä¿¡é¢æ°ã远å
CodePenã«ãã JavaScript ã«ã以äžã®é¢æ°ã远å ããŠãã ããð
function sendToSheet(checkedItems) {
const url = "â
ããã«GASã§ãããã€ããURLã貌ãä»ããŠãã ããâ
";
fetch(url, {
method: "POST",
mode: "no-cors",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
checkedItems: checkedItems
}),
})
.then(() => {
console.log("â
ã¹ãã¬ããã·ãŒãã«éä¿¡ããŸããïŒ");
})
.catch((error) => {
console.error("â ãšã©ãŒãçºçããŸãã:", error);
});
}
â ïž const url = "..." ã®éšåã¯ãã¹ãããâ¢ã§ã³ããŒããGASã®URLã貌ã£ãŠãã ãã
â ã¹ãããâ€ïŒãã§ãã¯ãªã¹ãéä¿¡åŠçã«çµã¿èŸŒã
以äžã®ã³ãŒãããJavaScript ã«ãã®ãŸãŸè²Œãä»ããŠãã ããð
submitChecklist() 颿°ã®äžã«ãã¹ãã¬ããã·ãŒãéä¿¡åŠçã远å ããŠããŸãã
function submitChecklist() {
const checkedItems = [];
const checkboxes = document.querySelectorAll('input[name="item"]:checked');
checkboxes.forEach((cb) => checkedItems.push(cb.value));
// åå¥éä¿¡ïŒããšããšã®åŠçïŒ
checkedItems.forEach((item) => {
sendCheckItem(item);
});
const timestamp = new Date().toLocaleString();
const resultDiv = document.getElementById('checklist-result');
if (checkedItems.length === 0) {
resultDiv.innerHTML = `<p style="color:red;">äœããã§ãã¯ãããŠããŸãã</p>`;
return;
}
resultDiv.innerHTML = `
<p>ð§¹ ãã§ãã¯å®äºïŒ</p>
<ul>
${checkedItems.map(item => `<li>${item}</li>`).join('')}
</ul>
<p><small>${timestamp} ã«èšé²ãããŸãã</small></p>
`;
// â
ãã§ãã¯é
ç®ããŸãšããŠã¹ãã¬ããã·ãŒãã«éä¿¡ïŒ
sendToSheet(checkedItems.join(', '));
}
â ïž ãã®é¢æ°ãæ£ããåäœããããã«ã¯ãsendToSheet() 颿°ãå¥ã§å®çŸ©ãããŠããå¿ èŠããããŸãïŒã¹ãããâ£åç §ïŒ
â 宿åã¯ãã¡ãïŒ
- Teachable Machineã§ååŠå€å®
- åæ Œã«ãªã£ãããã§ãã¯ãå ¥ãã
- ãã§ãã¯å®äºãã¿ã³ãæŒããš â å®äºæ¥æãã¹ãã¬ããã·ãŒãã«èšé²ïŒ
âïž ãããã«
ããã§ãã ã®"ãã¬ã€æ±ããå€å®ããã ãã®ãã·ãŒã³"ãã"æž
æãã§ãã¯ãªã¹ããã·ãŒã³"ã«å€ãããŸããã
ãããªãã°åŠ»ãçŽåŸããŠããããããããŸããã
âŠ
ã§ãããŸãæ©å«ãæªããªããšé¢åãªãã§äœ¿ã£ãŠãããã®ã¯ãããŠãããŸãã
ãããŸã§èªãã§ããã ããããããšãããããŸããïŒ



![Screenshot_2025-05-31-16-17-38-966_com.android.chrome[1].jpg](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F4049380%2F3c7453cf-10a2-4859-83c3-95bbc7d81baa.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a4f1e2c5a7dc62e75e9733bc35d92ca6)

