可視化推理預測系統功能簡介參看:48.1.基于Python+PyQt5的可視化推理預測系統
界面設計參看:48.2.PyQt5的可視化推理預測系統——UI設計
有兩個資源文件:
1、OpenCV的人臉級聯分類器xml文件:haarcascade_frontalface_alt.xml,用來檢測人臉,文件也比較小,所以當成資源文件打包,運行程序,自動釋放資源文件。
#釋放資源文件
if not os.path.exists("haarcascade_frontalface_alt.xml"):
QtCore.QFile.copy(":harr/haarcascade_frontalface_alt.xml","haarcascade_frontalface_alt.xml")
2、程序啟動的畫面圖像文件
#讀取資源圖像
splash = QtWidgets.QSplashScreen(QtGui.QPixmap(':img/start.jpg'))
splash.show()
#在lable上顯示圖像
def imgshow(self,frame,lbl):
#img=QtGui.QImage(frame.data,frame.shape[1],frame.shape[0],QtGui.QImage.Format_BGR888)
#重載修復圖像顯示變形問題
img = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[1] * 3,QtGui.QImage.Format_BGR888)
#按比例縮放
if self.isscaled:
lbl.setPixmap(QtGui.QPixmap.fromImage(img).scaled(480, 480, QtCore.Qt.KeepAspectRatio))
else:
lbl.setPixmap(QtGui.QPixmap.fromImage(img))
lbl.setScaledContents(True) #自適應大小
注意:有時會因為圖像格式問題,顯示出來的圖像會變形不全,這里就要使用重載修復圖像顯示變形問題。
顯示圖像
沒有選擇任務模型就是預覽,否則就是根據選擇的任務模型預測
#打開輸入數據類型
def Open(self):
self.Close()
self.isstop=False
self.isscaled=self.cboxscaled.isChecked()
#獲取選項按鈕狀態
self.iscam=self.rbtcam.isChecked()
self.isimg=self.rbtimg.isChecked()
self.isvideo=self.rbtvideo.isChecked()
self.isipcam=self.rbtipcam.isChecked()
taskid=self.cboxtask.currentIndex()
task=self.cboxtask.currentText()
model_dir=os.path.join("models",self.cboxtask.currentText(),self.cboxmodel.currentText(),"inference_model")
#print(model_dir)
#圖像縮放
self.isscaled=self.cboxscaled.isChecked()
if taskid==0:#預覽
if self.isimg:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇','', "圖像文件(*.jpg *.png)")
if self.fileName!="":
frame=cv2.imread(self.fileName)
self.imgshow(frame,self.lblsrc)
else:
self.Display()
else:#預測
if self.iscam or self.isipcam:
if task in ["face-model"] :
self.cls_videodetect(model_dir,isface=True)
if task in ["cls-model"]:
self.cls_videodetect(model_dir,isface=False)
if task in ["det-model"]:
self.det_videodetect(model_dir)
if self.isimg:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇','', "圖像文件(*.jpg *.png)")
if self.fileName!="":
frame=cv2.imread(self.fileName)
self.imgshow(frame,self.lblsrc)
#print(task)
if task in ["face-model"]:#調用圖像分類-人臉檢測與識別任務,結果顯示在dst上
self.cls_imgpredict(model_dir,self.fileName,isface=True)#預測返回結果
if task in ["cls-model"]: #調用圖像分類-貓狗分類
self.cls_imgpredict(model_dir,self.fileName,isface=False)#預測返回結果
if task in ["det-model"]:#調用目標檢測-人頭檢測
self.det_imgpredict(model_dir,self.fileName)
if self.isvideo:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇視頻文件','', '*.mp4')
if self.fileName!="":
if task in ["face-model"] :
self.cls_videodetect(model_dir,self.fileName,isface=True)
if task in ["cls-model"]:
self.cls_videodetect(model_dir,self.fileName,isface=False)
if task in ["det-model"]:
self.det_videodetect(model_dir,self.fileName)
貓狗分類預測
#開啟拍照或錄制
def snap(self):
if self.cap.isOpened():
self.issnap=True
def rec(self):
if self.cap.isOpened():
self.isrec =not self.isrec
if self.isrec:
#創建video writer
ret,frame=self.cap.read()
self.createVideo(frame)
self.btnrec.setText("停止錄制")
self.statusBar().showMessage("文件錄制中…………\n")
else:
self.video.release() #釋放video writer
self.btnrec.setText("開始錄制")
self.statusBar().showMessage("文件保存在output目錄里\n")
#攝像頭或監控拍照
def imgsave(self,frame):
if self.rbtcam.isChecked() or self.rbtipcam.isChecked():
fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S")+".jpg"
if not os.path.exists("output"):
os.makedirs("output")
cv2.imwrite(os.path.join("output",fname),frame)
self.statusBar().showMessage(fname+"文件保存在output目錄里\n")
self.issnap=False
#攝像頭或監控錄制
def createVideo(self,frame):
if self.rbtcam.isChecked() or self.rbtipcam.isChecked():
fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S")+".mp4"
if not os.path.exists("output"):
os.makedirs("output")
self.video=cv2.VideoWriter(
filename=os.path.join("output",fname),
fourcc=cv2.VideoWriter_fourcc(*"mp4v"),
fps=15,
frameSize=(frame.shape[1],frame.shape[0])
)
注:這里要注意保存錄像的文件名命名格式,避免文件名重置。
可視化推理預測系統功能簡介參看:48.1.基于Python+PyQt5的可視化推理預測系統
界面設計參看:48.2.PyQt5的可視化推理預測系統——UI設計
有兩個資源文件:
1、OpenCV的人臉級聯分類器xml文件:haarcascade_frontalface_alt.xml,用來檢測人臉,文件也比較小,所以當成資源文件打包,運行程序,自動釋放資源文件。
#釋放資源文件
if not os.path.exists("haarcascade_frontalface_alt.xml"):
QtCore.QFile.copy(":harr/haarcascade_frontalface_alt.xml","haarcascade_frontalface_alt.xml")
2、程序啟動的畫面圖像文件
#讀取資源圖像
splash = QtWidgets.QSplashScreen(QtGui.QPixmap(':img/start.jpg'))
splash.show()
#在lable上顯示圖像
def imgshow(self,frame,lbl):
#img=QtGui.QImage(frame.data,frame.shape[1],frame.shape[0],QtGui.QImage.Format_BGR888)
#重載修復圖像顯示變形問題
img = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[1] * 3,QtGui.QImage.Format_BGR888)
#按比例縮放
if self.isscaled:
lbl.setPixmap(QtGui.QPixmap.fromImage(img).scaled(480, 480, QtCore.Qt.KeepAspectRatio))
else:
lbl.setPixmap(QtGui.QPixmap.fromImage(img))
lbl.setScaledContents(True) #自適應大小
注意:有時會因為圖像格式問題,顯示出來的圖像會變形不全,這里就要使用重載修復圖像顯示變形問題。
顯示圖像
沒有選擇任務模型就是預覽,否則就是根據選擇的任務模型預測
#打開輸入數據類型
def Open(self):
self.Close()
self.isstop=False
self.isscaled=self.cboxscaled.isChecked()
#獲取選項按鈕狀態
self.iscam=self.rbtcam.isChecked()
self.isimg=self.rbtimg.isChecked()
self.isvideo=self.rbtvideo.isChecked()
self.isipcam=self.rbtipcam.isChecked()
taskid=self.cboxtask.currentIndex()
task=self.cboxtask.currentText()
model_dir=os.path.join("models",self.cboxtask.currentText(),self.cboxmodel.currentText(),"inference_model")
#print(model_dir)
#圖像縮放
self.isscaled=self.cboxscaled.isChecked()
if taskid==0:#預覽
if self.isimg:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇','', "圖像文件(*.jpg *.png)")
if self.fileName!="":
frame=cv2.imread(self.fileName)
self.imgshow(frame,self.lblsrc)
else:
self.Display()
else:#預測
if self.iscam or self.isipcam:
if task in ["face-model"] :
self.cls_videodetect(model_dir,isface=True)
if task in ["cls-model"]:
self.cls_videodetect(model_dir,isface=False)
if task in ["det-model"]:
self.det_videodetect(model_dir)
if self.isimg:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇','', "圖像文件(*.jpg *.png)")
if self.fileName!="":
frame=cv2.imread(self.fileName)
self.imgshow(frame,self.lblsrc)
#print(task)
if task in ["face-model"]:#調用圖像分類-人臉檢測與識別任務,結果顯示在dst上
self.cls_imgpredict(model_dir,self.fileName,isface=True)#預測返回結果
if task in ["cls-model"]: #調用圖像分類-貓狗分類
self.cls_imgpredict(model_dir,self.fileName,isface=False)#預測返回結果
if task in ["det-model"]:#調用目標檢測-人頭檢測
self.det_imgpredict(model_dir,self.fileName)
if self.isvideo:
self.fileName, self.fileType = QtWidgets.QFileDialog.getOpenFileName(self, '選擇視頻文件','', '*.mp4')
if self.fileName!="":
if task in ["face-model"] :
self.cls_videodetect(model_dir,self.fileName,isface=True)
if task in ["cls-model"]:
self.cls_videodetect(model_dir,self.fileName,isface=False)
if task in ["det-model"]:
self.det_videodetect(model_dir,self.fileName)
貓狗分類預測
#開啟拍照或錄制
def snap(self):
if self.cap.isOpened():
self.issnap=True
def rec(self):
if self.cap.isOpened():
self.isrec =not self.isrec
if self.isrec:
#創建video writer
ret,frame=self.cap.read()
self.createVideo(frame)
self.btnrec.setText("停止錄制")
self.statusBar().showMessage("文件錄制中…………\n")
else:
self.video.release() #釋放video writer
self.btnrec.setText("開始錄制")
self.statusBar().showMessage("文件保存在output目錄里\n")
#攝像頭或監控拍照
def imgsave(self,frame):
if self.rbtcam.isChecked() or self.rbtipcam.isChecked():
fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S")+".jpg"
if not os.path.exists("output"):
os.makedirs("output")
cv2.imwrite(os.path.join("output",fname),frame)
self.statusBar().showMessage(fname+"文件保存在output目錄里\n")
self.issnap=False
#攝像頭或監控錄制
def createVideo(self,frame):
if self.rbtcam.isChecked() or self.rbtipcam.isChecked():
fname=datetime.datetime.now().strftime("%Y%m%d%H%M%S")+".mp4"
if not os.path.exists("output"):
os.makedirs("output")
self.video=cv2.VideoWriter(
filename=os.path.join("output",fname),
fourcc=cv2.VideoWriter_fourcc(*"mp4v"),
fps=15,
frameSize=(frame.shape[1],frame.shape[0])
)
注:這里要注意保存錄像的文件名命名格式,避免文件名重置。