- 1. DiscordとLINEをPython+FastAPI+Dockerで連携させる【その1】DiscordからLINEへテキストメッセージ
- 2. 【個人開発】会話AIを「ずんだもん風」に話せるように作ってみる
- 3. 牛丼と親子丼をもっと見分ける…!!(転移学習編)
- 4. streamlitを起動し続ける方法
- 5. PIPで入れたモジュールの中身を出力して、pipでモジュールを一括でインストールする方法
- 6. Django Ninjaを使ってみた
- 7. 【Python】文字列の数字をint()で数値に変換する時、引数に空文字やNoneが入ってきた場合エラーを回避する方法
- 8. paizaラーニング「さまざまな長さの配列の和 Python3編」
- 9. [Python] 絶対わかるデコレータの説明
- 10. 【Python】Array.prototype.mapのようなLINQのようなパイプのようなやつ
- 11. 【DRF】データごとの件数をカウントして返すやり方
- 12. [Python] Fletとは
- 13. FastAPIのエラーハンドリング
- 14. プログラミング初心者が初めてAIを作ってみた件
- 15. Pythonでの両端キュー(deque)
- 16. テキストの前処理
- 17. Pythonでyamlファイルを用いたlogging
- 18. [Python] Selenium タイムアウトエラー時にリトライ
- 19. SSIMオートエンコーダでMVTecADのボトルを学習
- 20. pythonデータセットインポート(範囲の指定の方法)
DiscordとLINEをPython+FastAPI+Dockerで連携させる【その1】DiscordからLINEへテキストメッセージ
# 挨拶
Zennにも同様の投稿をしています。
https://zenn.dev/maguro_alterna/articles/f5a52f1cb8b1e7
こんにちは。マグロです。
以前記事にしたものの続編です。https://qiita.com/maguro-alternative/items/4a47de7725b5ee84b230
LINE Notify対応版が完成したので、記事にします。
https://github.com/maguro-alternative/discordfast
順を追って解説できるように、記事をいくつか分割して解説します。
今回はDiscordからLINEへテキストメッセージを送ります。すぐに使いたい場合は上記のリポジトリをフォークしてrailwayにデプロイしてください。
# 注意
以下の知識があることが前提となります。
– Python
– Discord.py+Pycord
– LINE Message API
– LINE Notify
– Dockerまた、前回と同様、railwayでホストすることを想定しており
【個人開発】会話AIを「ずんだもん風」に話せるように作ってみる
みなさんは「ずんだもん」というキャラクターをご存知でしょうか。ずんだもんはSSS合同会社が運営する東北地方応援キャラクターとして誕生したものでした。しかし音声合成ソフトVoiceVoxに導入されたことをきっかけにYoutubeなどの動画サイトでもよく見かけるようになり、それらにおける汎用キャラとしての役割の方が目立っています。
![名称未設定のデザインのコピー-4-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/9a2e859d-0a90-b730-9d66-f3b897e7cde9.jpeg)
> voicebox公式サイトより 「呼び方」のページも参考になります
ずんだもんの特徴は何といっても「ボクはずんだもんなのだ」「元気なのだ」というような「〜なのだ」口調です。どんな内容でも話し方で共通の個性が出せることも普及した一つの要因だと言えるでしょう。また、これは文章においても同じです。
そこで今回はこの「〜なのだ」口調を導入した会話AIを作っていきたいと思います。
# 作
牛丼と親子丼をもっと見分ける…!!(転移学習編)
# 1 はじめに
https://qiita.com/tasuku303/items/04ee25ff601304a987f3
この記事は、前回の記事[CNNで親子丼と牛丼を見分ける…!!](https://qiita.com/tasuku303/items/04ee25ff601304a987f3)の続編です!前回はテストデータでおよそ84%の精度を達成しましたが、もう少し精度を向上できないかと思いました、、、
そこで、今回は転移学習を実施して精度向上できないか検証してみました。結果として、約95%の精度を達成することができました!!また、モデルが何を見て判断しているか確認するためにGradCAMを用いて可視化してみたので、みていただいたら嬉しいです。
# 転移学習
## 転移学習とは
転移学習は、事前学習済みモデルを利用して出力層部分のみを自分の目的のタスク向けに交換し、出力層部分のみを自分で集めたデータセットで学習するというものです。例えば、犬と猫を高精度に識別したいとします。そして、あらかじめ1000カテゴリのマルチクラス分類を大量の画像データを利用して学習
streamlitを起動し続ける方法
streamlitを使ってアプリをAWS上で公開していましたが、気づいたらrunが途切れてることがあり、アプリ公開し続けられないんじゃない?と壁にぶち当たりました。
※次の日には途切れちゃう色々調べた結果、Linuxコマンドでできることがわかりましたので、アウトプットします。
## 解決策
コマンドをバックグラウンドで実行し続ける [nohup コマンド &] というコマンドを使えば解決しました。“`
nohup streamlit run ファイル名 &
“`そしてバックグラウンドで実行してるかを確認するコマンドが↓
“`
tail -f nohup.out
“`
nohup.out というファイルに実行結果が記載されていきます。停止するには「kill [ID]」コマンドを使えば、停止することができます。
## 原因追求
長い処理を実行している時にterminalを閉じたり、端末をとじてしまうと実行中のプロセスにはHUPシグナル(SIGHUP:制御している端末の終了を伝えるシグナル)が送られます。その上、streamlitは起動するとターミナルが操作で
PIPで入れたモジュールの中身を出力して、pipでモジュールを一括でインストールする方法
まずrequirements.txtをファイルに出力する。
$ pip freeze > requirements.txtこのrequirements.txtを別の環境にコピーして一括インストールする。
$ pip install -r requirements.txt
Django Ninjaを使ってみた
従来、DjangoやDjango Rest Frameworkを使ってきたが、非同期を使いたい時や処理速度をもっと上げたいと思っていました。
その時、以下の記事を見つけたため、ちょっと使ってみた際の備忘録です。
https://zenn.dev/chanmoro/articles/b980d8fa681362グローバルのPythonにインストール
“`python:terminal
pip install django-ninja
“`プロジェクトを作成したいディレクトリで実行
“`python:terminal
django-admin startproject {アプリ名} # 今回はDjangoNinjaTempleteとする
“`認証機能を作るためdjango-ninja-jwtをインストール
“`python:terminal
pip install django-ninja-jwt
pip install django-ninja-extra # エラー吐いた場合、必要かも
pip install six # エラー吐いた場合、必要かも
“`
【Python】文字列の数字をint()で数値に変換する時、引数に空文字やNoneが入ってきた場合エラーを回避する方法
# 背景
可変で流れてくる文字列の数値をint()で数値に変換して変数に格納するという処理をコーディングしていた。
この文字列の部分が稀に空文字で流れてくることもあり、その場合int()でエラーが発生してしまうことがわかったのでエラーの回避方法があるか調査してみた。## この記事を読むとできるようになること
int()で引数に空文字やNoneが渡された場合、エラーを回避してデフォルト値を返却できるようになる。## まずは調べてみた
ググった結果、知りたかったことが書いてるサイトを発見!!
こちらの記事を参考に、実際に試してみる。## 記事を元に試してみる
### int()に空文字やNoneを渡して実行してみる
“`terminal
>>>
paizaラーニング「さまざまな長さの配列の和 Python3編」
https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__various_row_sum
この問題、結構考えたのですが、解りませんでした。
#### 解答例
“`Python 3
n = int(input())for _ in range(n):
k_a = [int(i) for i in input().split()]
k = k_a[0]
a = k_a[1:]
s = 0
for i in range(k):
s += a[i]
print(s)
“`
[Python] 絶対わかるデコレータの説明
### 説明
デコレータは他の関数の機能を変更したり拡張したりすることができる関数です。### 使用方法
まずデコレータ関数を定義し、
@decorator_nameという構文を修正したい関数に追加します。
“`python
def my_decorator(func):
def wrapper():
print(“start”)
func()
print(“end”)
return wrapper@my_decorator
def say_hello():
print(“hello”)say_hello()
“`
実行結果:
“`bash
start
hello
end
“`#### 說明
@my_decoratorはPythonの糖衣構文です。
say_hello関数をmy_decorator関数の引数として渡すことができます。簡単に言うと、@my_decoratorは以下の記述と同じです。
“`python
say_hello = my_decorator(say_hello)
【Python】Array.prototype.mapのようなLINQのようなパイプのようなやつ
# はじめに
私は基本Pythonしか書かないのですが、C#でデスクトップアプリ開発に手を出してみたりして、
パイプっぽいリストの加工便利だなーと感じ、Pythonで似たような?ことをできるようなクラスを試しに書いたメモ。
n番煎じ。# こんなの
“`py
arr = (l (range(10))
| (lambda x: 2 * x)
| (lambda x, i: x + i)
| (lambda x, i, arr: x * arr[-i-1]))print(arr) # -> [0, 72, 126, 162, 180, 180, 162, 126, 72, 0]
“`
使用している書体によっては`l`から縦棒が連なってる感じで見た目がよい。“`py
import requests
from bs4 import BeautifulSoupsoup = BeautifulSoup(requests.get(“https://qiita.com/tags/python”).content)
dict(
l
【DRF】データごとの件数をカウントして返すやり方
タイトルの通りなんですけどこれがなかなかできなくて4時間くらいずっとハマってしまったのでメモしておきます。
## やりたきこと
タイトルの通りなんですけど、例えば記事モデルと、タグのモデルがあるとします。
そして、タグごとに、「そのタグをつけて投稿してるユーザ数」みたいなデータがほしいとします。“`models.py
class Tag(models.Model):
name = models.CharField(max_length=40)class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
content = models.TextField()
tags = models.ManyToManyField(Tag, blank=False)“`
※実際であれば、Userモデルもあ
[Python] Fletとは
## Fletとは
– フロントエンド開発の経験がなくても、好みの言語で開発可能なフレームワーク
– インタラクティブなマルチユーザWeb
– デスクトップ
– モバイルアプリケーション
– Flutter by Google に基づくFlet Controls を用いてプログラムのUIを構築
– Flutterウィジェットをラップするだけでなく独自の意見を追加
– 小さなウィジェットを組み合わせる
– 複雑さを隠す
– UIのベストプラクティスを実装
– 合理的なデフォルトを適用## Flet app example
– 現在はPythonでFletアプリを書くことが可能
– 他の言語も近々追加予定### ライブラリ追加
“`sh
# pipの場合
$ pip install flet
# poetryの場合
$ poetry add flet
“`### 実装例
“`python
#!/usr/bin/env python3
# -*- coding: utf
FastAPIのエラーハンドリング
## 概要
– FastAPIのエラーハンドリングについて
– エントリーポイントと同じファイルに定義するかどうかで処理が変化
– 同じ場合はハンドラーを使用
– 違う場合はミドルウェアを使用## エントリーポイントと同じファイルで定義
### ディレクトリ構造
“`sh
fastapi_example
├── __init__.py
└── main.py # FastAPIのエントリーポイント
“`### 実装例
“`python:fastapi_example/main.py
#!/usr/bin/env python3
# -*- coding: utf_8 -*-
“””FastAPIのエントリーポイント
“””from fastapi import FastAPI, status
from fastapi.responses import JSONResponseapp = FastAPI()
@app.exception_handler(Exception)
async def exception_handler
プログラミング初心者が初めてAIを作ってみた件
プログラミング初心者が初めて一人で作ったフルーツ分類AIについて記事を書いていこうと思います。
まず、なぜ初めてのAI開発でフルーツ分類を作ったかと言うと、初めてAIを作るならいきなり難易度の高いものじゃなくて簡単なものから作っていこうと思ったからです。
とはいえ、フルーツ分類も決して簡単ではありませんでした。この記事では自分が苦労したことも書いていこうと思います。
## コードの説明
はじめに、以下は画像データに正解となるラベルを紐付けしてtransformsを使って画像データの中心を128×128にクロップ、グレースケールにして、最後にテンソル化しているコードです。ラベルもテンソル化しています。ちなみに学習用画像データは2292枚、テスト用画像データは1020枚用意しました。
画像データはこちらを使用しました。↓
[https://www.kaggle.com/datasets/karimabdulnabi/fruit-classification10-class?resource=download](https://www.kaggle.com/datasets/kari
Pythonでの両端キュー(deque)
## 概要
– listの先頭要素削除の処理(pop(0))の時間はlistの長さの二乗で増加
– pop(0)はlistの全要素を1つずつ前にずらすので、要素全体を再代入する必要があるため
– collectionsモジュールのdequeクラスは両端キュー
– 要素を先頭または末尾に追加、削除するときに定数時間演算で可能
– 先頭要素に対して追加、削除を実施する処理を行う場合はdequeの使用を推奨
– 今回の実装での測定結果(pop処理を先頭要素に100000回実施)| 対象 | 時間 |
| — | — |
| list | 2.245 |
| deque | 0.111 |## list
“`python:list_example.py
#!/usr/bin/env python3
# -*- coding: utf_8 -*-
“””listの処理時間計測
“””from cProfile import Profile
from pstats import Statsdef all_pop(array):
for _ in
テキストの前処理
# はじめに
自然言語処理をする際、テキストの正規化、日本語の前処理を行う必要があります。
それを行うPythonのコードが出回っていたのですが、それがあまりにもひどかったので戦慄しました。
おそらく[こちら](https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja)が発端だと思うのですが、よりよいコードで塗り替えたいと思うに至りました。# 結論
“`python
import re
import unicodedataOTHERTRANS = str.maketrans(
‘’”‘。、’,
‘\'”`.,’
)CTRLCHAR_PATTERN = re.compile(‘[\u0000-\u001F]’)
SAPCE_PATTERN = re.compile(r”\s+”)
HYPHEN_PATTERN = re.compile(‘[˗֊‐‑‒–⁃⁻₋−]+’)
CHOONPU_PATTERN = re.compile(‘[﹣-ー—―─━ー]+’)
TILDE_PATTERN =
Pythonでyamlファイルを用いたlogging
## 概要
– エラーレベルに応じてloggerを使い分ける実装例
– loggerの設定はyamlファイルで実施| logger | 備考 |
| — | — |
| applicationlogger | application.logにINFO 以上を記録 |
| emergencylogger | emergency.logにERROR 以上を記録 |## 使用ライブラリ
– PyYAML“`sh
# 標準機能
$ pip install PyYAML
# poetryを使用している場合
$ poetry add PyYAML
“`## ディレクトリ構成
“`sh
.
├── conf.yaml # ログの設定ファイル
├── target # ログの出力ファイル
├── example.py # ログの使用例
└── logger.py # ログの定義
“`## 実装
### 設定
“`yaml:conf.yaml
version: 1
formatters:
simple:
forma
[Python] Selenium タイムアウトエラー時にリトライ
# 該当エラー
selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 600.000# リトライ(再試行)ロジック
“`python
retry_count = 3
for retry_time in range(retry_count):
try:
# Selenium code that might raise TimeoutException
# selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: 600.000selenium_execute() # selenium 処理
SSIMオートエンコーダでMVTecADのボトルを学習
# SSIMを構築して結果を確認した
ここでMVTecのbottleを使用してSSIMオートエンコーダでの検証を行う。
https://www.mvtec.com/company/research/datasets/mvtec-ad# 前回はMVTecADのタイルを使用した
しかしながら、結果は上手く復元することが出来ず判別には利用できそうにもない。
ここで、改めてMVTecソフトウェア社の論文から参照すると・提供されるデータはオブジェクト系とテクスチャ系に分けられる
・テクスチャ系とは木目やタイルなど同じ系統だが分布がランダムなものを示す
・オブジェクト系とは工業製品等の同じ位置で撮影されるようなデータを示す。
・SSIMオートエンコーダはテクスチャ系には弱いとある。
ではオブジェクト系ではどうなるのかをここで検証する。
正常の入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079535/dba9cc28-2984-cdc9-e1b3-e6fefe05715
pythonデータセットインポート(範囲の指定の方法)
## 必要なデータを作成する。
エクセルファイルや、CSVファイルからデータを読み込んでもよいが、
今回は、データの作成から行ってみます。
架空のアイドルチームと髪の毛の色のデータを作成していきます。
“`python
list1=[[“purple”,”yellow”,”red”], [“indigo”,”Light blue”,”pink”],
[“black”,”red”,”black”],[“white”,”bright green”,”gold”],
[“pink”,”purple”,”green”],[“skyblue”,”pink”,”green”]]
index1 = [“チーム1”, “チーム2”, “チーム3″,”チーム4″,”チーム5″,”チーム6”]#行
columns1 =[“1人目”, “2人目”, “3人目”]#列
dataset = pd.DataFrame(data=list1, index=index1, columns=columns1)dataset
“`
以下のように出力されます。
||1人目|2人目|3人