說在前面的話
導(dǎo)師有一個(gè)異常行為檢測(cè)的小任務(wù)(吸煙行為檢測(cè)),給我讓我和師弟一起去完成。本身以為在YOLOv5的detect.py檢測(cè)腳本中加入語音提示很簡(jiǎn)單,但是其中的過程卻是一言難盡。
這也是查閱了很多資料,嘗試過了各種大佬分享的經(jīng)驗(yàn),集百家之長(zhǎng)完成了這個(gè)任務(wù),感謝CSDN中各位有開源精神的大佬的代碼分享。
一、語音生成腳本
首先先安裝好這個(gè)庫:pyttsx3
在PyCharm這個(gè)軟件中打開命令行(或叫:終端),激活自己所需的虛擬環(huán)境,
然后輸入指令: pip install pyttsx3
等待安裝完成即可。
語音生成、合成腳本如下:
# 導(dǎo)入pyttsx3庫
import pyttsx3
class Voice():
def __init__(self):
self.engine = pyttsx3.init() # 創(chuàng)建engine并初始化
self.engine.setProperty('rate', 150)
self.engine.setProperty('volume', 1.0) # 在0到1之間重設(shè)音量
def synthesis(self, text, filename):
self.engine.save_to_file(text, filename)
self.engine.runAndWait()
def play(self, filename):
self.engine.say(filename)
self.engine.runAndWait()
self.engine.stop()
if __name__ == "__main__":
speech = Voice()
speech.synthesis('注意,請(qǐng)勿吸煙!', '請(qǐng)勿吸煙.mp3') #此句是在當(dāng)前文件目錄下生成mp3文件,
#語音內(nèi)容就是:注意,請(qǐng)勿吸煙!
speech.play('注意,請(qǐng)勿吸煙') #此句是直接合成語音并播放
二、本地語音播放軟件
首先選取FFmpeg播放器來播放自己錄制好的mp3文件,F(xiàn)Fmpeg擁有LGPL/GPL許可和前沿音/視頻編解碼庫libavcodec,使用方便,功能強(qiáng)大。雖然FFmpeg(Fast Forward mpeg視頻編碼標(biāo)準(zhǔn))在Linux系統(tǒng)開發(fā)并且在Linux系統(tǒng)使用較多,但在windows系統(tǒng)下也同樣可以用來錄制、編解碼、轉(zhuǎn)換、流化音視頻等。FFmpeg在各種各樣的構(gòu)建環(huán)境、機(jī)器架構(gòu)和配置下編譯、運(yùn)行,支持Linux、Mac OS X、Microsoft Windows、bsd、Solaris等。
FFmpeg具體下載地址:https://github.com/BtbN/FFmpeg-Builds/releases,如下圖:
下載ffmpeg-N-104947-g631e31773b-win64-gpl.zip文件
解壓fmpeg-N-104947-g631e31773b-win64-gpl.zip文件,里面有這些:
ffmpeg.exe:音視頻轉(zhuǎn)碼、轉(zhuǎn)換器。
ffplay.exe:簡(jiǎn)單的音視頻播放器。
ffprobe.exe:簡(jiǎn)單的多媒體碼流分析器。
三、YOLOv5的detect.py程序改進(jìn)
在detect.py代碼中修改!!
仔細(xì)找程序,睜大眼睛
第一步:
找到光標(biāo)定位到的這里
插入如下代碼
value = det[:, 4].max().item() # 解決的是看到視頻就報(bào)警 每取四個(gè)值 找到最大 大于0.5才播放告警語音
if value > 0.5: # 大于0.5播放警示語音
count += 1 # count等于一個(gè)濾波 小延時(shí) 防止誤報(bào) 累計(jì)5個(gè)數(shù)之后再報(bào)
if count > 5:
count = 0
if time.time() - tplay > 1.8: # 防止聲音疊加 1.8s播放完再繼續(xù)
import os #
os.system(
'start /b D:/Teacher_project/yolov5-v5s-smoke/ffmpeg/bin/ffplay.exe -autoexit -nodisp D:/Teacher_project/yolov5-v5s-smoke/abc.mp3') # 音樂播放
#參數(shù)含義: start /b 后臺(tái)啟動(dòng) ffplay音樂播放軟件的位置
#-autoexit 播放完畢自動(dòng)退出 -nodisp不顯示窗口 mp3語音的位置路徑
tplay = time.time() # 當(dāng)前系統(tǒng)時(shí)鐘
效果如下:
第二步:
再找到光標(biāo)定位到的這里:
加入如下代碼:
t0 = time.time()
count = 0
tplay = 0
效果如下:
到這里就改完了,運(yùn)行detect.py腳本就行。
四、代碼思想解釋
這是集百家之長(zhǎng)所得。
加入后臺(tái)語音播放的記錄:(總體原理如下)
第一步計(jì)算每四幀圖像的最大置信度是為了解決人眼還沒看到煙時(shí),計(jì)算機(jī)已經(jīng)識(shí)別到其中一幀大于閾值的問題,選取四幀計(jì)算最大值增加了可靠性。
計(jì)算后的置信度大于閾值進(jìn)入下一步,否則返回上一步繼續(xù)等待,閾值設(shè)定為0.5。
count計(jì)數(shù)濾波相當(dāng)于設(shè)置了一個(gè)濾波器,用較短的延時(shí)濾除掉一些小毛刺,減少誤報(bào)的幾率,提升準(zhǔn)確性。
使用time.time函數(shù)計(jì)算時(shí)間差是為了完整的播放語音,防止吸煙出現(xiàn)時(shí)語音疊加;時(shí)間差大于設(shè)定值時(shí)播放對(duì)應(yīng)語音,否則返回上一步 繼續(xù)等待,設(shè)定值設(shè)置為3.0s。這個(gè)值取決于由語音的時(shí)長(zhǎng);最后播放對(duì)應(yīng)語音時(shí), 首先使用‘start /b’開始播放語音,可以設(shè)置為后臺(tái)啟動(dòng),解決了播放語音時(shí)視頻卡幀的問題, 同時(shí)在后綴加上‘-autoexit’,播放完語音后自動(dòng)退出,解決了語音播放完之后,窗口卡 頓的問題,再加上‘-nodisp’,可以不顯示語音播放窗口。
五、效果展示
背景音有點(diǎn)嘈雜,大家湊合看一下吧。
素材
六、寫在后面
①之前也嘗試過采用多線程技術(shù)來解決這個(gè)問題,但是奈何我代碼水平太差,無法將detect.py中的代碼改成我需要的樣子,所以放棄這個(gè)想法了。
②其實(shí)文章中的做法不是多線程,是進(jìn)行的后臺(tái)調(diào)用,但是最終達(dá)到的效果是差不多的。文章來源:http://www.zghlxwxcb.cn/news/detail-803036.html
七、最后的最后
為自己推銷一下。這里還有標(biāo)注好的吸煙數(shù)據(jù)集、接打電話手機(jī)數(shù)據(jù)集、電梯按鍵數(shù)據(jù)集,訓(xùn)練好的YOLOv5檢測(cè)權(quán)重,YOLOv5的改進(jìn)好的方案(如注意力機(jī)制、結(jié)構(gòu)改進(jìn)等),有需要的同學(xué)私信滴滴我哦,絕對(duì)物美價(jià)廉。文章來源地址http://www.zghlxwxcb.cn/news/detail-803036.html
到了這里,關(guān)于如何使YOLOv5在檢測(cè)到目標(biāo)后進(jìn)行聲音告警提示?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!