亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python的人臉檢測(cè)與分類(lèi)過(guò)程詳解

 更新時(shí)間:2022年05月11日 10:39:55   作者:biyezuopinvip  
這篇文章主要介紹了基于Python的人臉檢測(cè)與分類(lèi),算法分為兩個(gè)部分識(shí)別人臉位置和確定人臉?lè)诸?lèi),由于這兩項(xiàng)工作截然相反,所以我們使用了兩個(gè)網(wǎng)絡(luò)分別完成,詳細(xì)過(guò)程跟隨小編一起看看吧

人臉識(shí)別

算法簡(jiǎn)介

我們的算法可以分成兩個(gè)部分,識(shí)別人臉位置和確定人臉?lè)诸?lèi)。這兩個(gè)部分可以看成:
1.檢測(cè)出人臉之間相似性。
2.檢測(cè)出人臉之間不同性。
由于這兩項(xiàng)工作截然相反,所以我們使用了兩個(gè)網(wǎng)絡(luò)來(lái)分別完成這兩項(xiàng)工作。

人臉檢測(cè)

簡(jiǎn)述

我們的人臉檢測(cè)網(wǎng)絡(luò)采用了和Faster RCNN類(lèi)似的策略,但我們?cè)赗OI Polling上進(jìn)行了創(chuàng)新,兼顧了小目標(biāo)檢測(cè)和大目標(biāo)檢測(cè),為此,我們還使用了改進(jìn)后的RESNET101_V2的網(wǎng)絡(luò),使我們的網(wǎng)絡(luò)對(duì)于小目標(biāo)更加敏感。在增加了少量的運(yùn)算單元后,我們的網(wǎng)絡(luò)可以識(shí)別24*24像素下的人臉(甚至于更低!)。我們調(diào)整了網(wǎng)絡(luò)結(jié)構(gòu),并沒(méi)有采用傳統(tǒng)的卷積網(wǎng)絡(luò)(提取特征)+全連接層(分類(lèi))的結(jié)構(gòu),而是采用了全卷積結(jié)構(gòu),這讓我們的識(shí)別網(wǎng)絡(luò)的速度遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)識(shí)別方法,識(shí)別精度也高于傳統(tǒng)的算子和特征值人臉識(shí)別算法。

數(shù)據(jù)集介紹

采用的數(shù)據(jù)集為FDDB數(shù)據(jù)集,該數(shù)據(jù)集圖像+注釋有600M左右。
圖像有各種大小和形狀,主要集中在(300600)*(300600)的像素上。
注:我們的訓(xùn)練網(wǎng)絡(luò)不在乎訓(xùn)練圖像的大小形狀(只要長(zhǎng)寬大于192就好)。
其注釋內(nèi)容為圖像中的人臉橢圓框:

[ra, rb, Θ, cx, cy, s]
ra,rb:半長(zhǎng)軸、半短軸
cx, cy:橢圓中心點(diǎn)坐標(biāo)
Θ:長(zhǎng)軸與水平軸夾角(頭往左偏Θ為正,頭往右偏Θ為負(fù))
s:置信度得分

通過(guò)坐標(biāo)變換后我們可以得到矩形框:

w = 2*max([abs(ra*math.sin(theta)),abs(rb*math.cos(theta))])
h = 2*max([abs(ra*math.cos(theta)),abs(rb*math.sin(theta))])
rect = [cx-w/2,cy-h/2,w,h]
即:
rect = [x,y,w,h](x,y為左上角坐標(biāo))

我們以圖為單位,從圖中抽取128個(gè)anchors,這128個(gè)anchors包括該圖中的全部正例和隨機(jī)的負(fù)例。最后使用我們進(jìn)行坐標(biāo)變換的矩形框進(jìn)行Bounding Box回歸。

算法介紹

流程圖

img = tf.constant(img,shape = (1,h,w,mod),dtype = tf.float32) # 圖像原始數(shù)據(jù)
# 使用無(wú)pool1&pool5的RESNET 101
net, endpoints = my_resnet(img,global_pool = False,num_classes=None,is_training=True,reuse = tf.compat.v1.AUTO_REUSE) # net's w&h = original_img's w&h / 8

我們進(jìn)行模型搭建和使用的平臺(tái)為windows10-python3.6.2-tensorflow-gpu。
首先,我們的圖像(img_batch = [batch_size,h,w,mod],batch_size為圖像的數(shù)量,h為圖像高度,w為圖像寬度,mod為圖像通道數(shù),這里我們處理的均為RGB三色彩圖,所以我們的通道數(shù)均為3)通過(guò)我們改進(jìn)版的RESNET101_V2網(wǎng)絡(luò),傳統(tǒng)的RESNET101_V2的網(wǎng)絡(luò)結(jié)構(gòu)如下:www.biyezuopin.vip

而我們的網(wǎng)絡(luò)去掉了pool1和pool5層,使網(wǎng)絡(luò)放縮系數(shù)從32下降到了8。這使我們的網(wǎng)絡(luò)對(duì)于小目標(biāo)更加的敏感。通過(guò)了該網(wǎng)絡(luò)后,我們得到了卷積后的信息圖:img_batch_conv = [batch_size,h/8,w/8,2048]

weights = {
            'down':tf.compat.v1.get_variable(name = 'w_down',shape = [1,1,2048,1024]),# 降采樣
            'feature':tf.compat.v1.get_variable(name = 'w_feature',shape = [1,1,1024,K*K*2])
            }
biases = {
            'down':tf.compat.v1.get_variable(name = 'b_down',shape = [1024,]), # 降采樣
            'feature':tf.compat.v1.get_variable(name = 'b_feature',shape = [K*K*2,])
        }

img_batch_conv首先通過(guò)一個(gè)shape = [1,1,2048,1024]的卷積算子,該算子的作用是進(jìn)一步的特征提取和降采樣。我們采用多步特征提取的策略是由于在RCNN[1]一文中,作者提出在VOC2012測(cè)試集下,三層的特征識(shí)別網(wǎng)絡(luò)比一層特征識(shí)別網(wǎng)絡(luò)的正確率要高。

通過(guò)該算子我們得到了一個(gè)[batch_size,h/8,w/8,1024]結(jié)構(gòu)的數(shù)據(jù),將該數(shù)據(jù)通過(guò)一個(gè)[1,1,1024,K*K*C]的算子得到特征圖feature_map。feature_map的概念在Faster RCNN[2]的文章內(nèi)提出,提取特征圖的算子的K*K代表著每一塊feature_map有K*K個(gè)bin,而C代表著識(shí)別物體的類(lèi)別+1(背景),這里我們的K取3,C取2(只有兩個(gè)分類(lèi):人臉和背景)。

    with tf.compat.v1.variable_scope('RPN', reuse=tf.compat.v1.AUTO_REUSE):
        weights = {
            'rpn_1':tf.compat.v1.get_variable(name = 'w_rpn_1_1',shape = [3,3,1024,1]), # 高:寬 1:1的卷積
            'rpn_2':tf.compat.v1.get_variable(name = 'w_rpn_1_2',shape = [3,6,1024,1]), # 高:寬 1:2的卷積
            'rpn_3':tf.compat.v1.get_variable(name = 'w_rpn_2_1',shape = [6,3,1024,1]), # 高:寬 2:1的卷積
            'rpn_4':tf.compat.v1.get_variable(name = 'w_rpn_2_2',shape = [6,6,1024,1]),
            'rpn_5':tf.compat.v1.get_variable(name = 'w_rpn_2_4',shape = [6,12,1024,1]),
            'rpn_6':tf.compat.v1.get_variable(name = 'w_rpn_4_2',shape = [12,6,1024,1]),
            'rpn_7':tf.compat.v1.get_variable(name = 'w_rpn_4_4',shape = [12,12,1024,1]),
            'rpn_8':tf.compat.v1.get_variable(name = 'w_rpn_4_8',shape = [12,24,1024,1]),
            'rpn_9':tf.compat.v1.get_variable(name = 'w_rpn_8_4',shape = [24,12,1024,1])
        }
        biases = {
            'rpn_1':tf.compat.v1.get_variable(name = 'b_rpn_1_1',shape = [1,]),
            'rpn_2':tf.compat.v1.get_variable(name = 'b_rpn_1_2',shape = [1,]),
            'rpn_3':tf.compat.v1.get_variable(name = 'b_rpn_2_1',shape = [1,]),
            'rpn_4':tf.compat.v1.get_variable(name = 'b_rpn_2_2',shape = [1,]),
            'rpn_5':tf.compat.v1.get_variable(name = 'b_rpn_2_4',shape = [1,]),
            'rpn_6':tf.compat.v1.get_variable(name = 'b_rpn_4_2',shape = [1,]),
            'rpn_7':tf.compat.v1.get_variable(name = 'b_rpn_4_4',shape = [1,]),
            'rpn_8':tf.compat.v1.get_variable(name = 'b_rpn_4_8',shape = [1,]),
            'rpn_9':tf.compat.v1.get_variable(name = 'b_rpn_8_4',shape = [1,])
        }

我們將得到的feature_map = [batch_size,h/8,w/8,K*K*C]使用三種不同形狀,三種不同大小,一共九種不同形狀或大小的卷積核對(duì)我們的網(wǎng)絡(luò)進(jìn)行卷積,得到了9種不同形狀或大小的archors中是否存在人臉的概率。這里我們雖然沿用了Faster RCNN[2]中anchor的概念,但我們并沒(méi)有使用ROI Pooling而是只使用了ROI。因?yàn)門(mén)ensorflow采用的是流圖計(jì)算,增加ROI Pooling反而會(huì)讓每個(gè)anchor獨(dú)立計(jì)算,大大增加了我們的計(jì)算量,而且不同大小的anchor進(jìn)行Pooling后均會(huì)生成K*K形狀的數(shù)據(jù),不方便我們的網(wǎng)絡(luò)對(duì)于不同大小的anchor進(jìn)行不同狀態(tài)的識(shí)別。而且由于我們只用分成背景和人臉兩個(gè)類(lèi)別,所以即使不進(jìn)行ROI Pooling,我們網(wǎng)絡(luò)所需的運(yùn)算單元也不會(huì)增加太多。所以我們采用了9種不同形狀的卷積核對(duì)應(yīng)九種anchor的策略。通過(guò)RPN評(píng)價(jià)層后,我們可以得到對(duì)于每個(gè)區(qū)域是否存在人臉的評(píng)價(jià)。

這里我們訓(xùn)練采用了YOLO[3]而不是Faster RCNN[2]的訓(xùn)練策略,即我們對(duì)于不同比例的正例和負(fù)例采用比例因子去平衡它。這是因?yàn)槲覀兪且粡堃粡垐D去訓(xùn)練的,訓(xùn)練的圖中正例的數(shù)量遠(yuǎn)小于負(fù)例。

loss_rpn[i] = -(up*tf.math.log(pred_rpn[i])*rpn_view[i] + (1 - rpn_view[i])*tf.math.log(1 - pred_rpn[i]))

這里loss_rpn[i]為第i個(gè)anchor的loss,up為正例激勵(lì)因子,pred_rpn[i]為網(wǎng)絡(luò)預(yù)測(cè)的第i個(gè)anchor的結(jié)果,rp_view[i]為第i個(gè)anchor的真實(shí)結(jié)果。我們的損失函數(shù)使用的是交叉熵。

之后,我們將選出來(lái)的區(qū)域的feature_map,通過(guò)ROI Pooling。在Bounding Box回歸之前通過(guò)ROI Pooling一方面是由于Bounding Box回歸只針對(duì)正例(選出來(lái)的區(qū)域),區(qū)域的個(gè)數(shù)較少,即使創(chuàng)建獨(dú)立運(yùn)算的anchor數(shù)量也不多,訓(xùn)練壓力不大;二是對(duì)于Bounding Box回歸,anchor的大小和形狀不具有太大的意義。Bounding Box回歸的計(jì)算規(guī)則如下:www.biyezuopin.vip

dx = x - x'
dy = y - y'
kw = w / w'
kh = h / h'
# 計(jì)算損失
loss_bbox = (pre_bbox - select_bbox) * data_type 
loss_bbox = tf.reduce_mean(loss_bbox*loss_bbox)

x,y為中心點(diǎn)坐標(biāo),w,h為寬高。
通過(guò)網(wǎng)絡(luò)我們可以得到[dx,dy,dw,dh]
loss_bbox即Bounding Box回歸的loss,損失函數(shù)我們采用的是平方函數(shù)。

我們首先通過(guò)RPN評(píng)價(jià)層得到評(píng)分最高的N個(gè)anchor,每個(gè)anchor都帶有[ax,ay,aw,ah]的屬性,ax,ay為網(wǎng)絡(luò)放縮下的左上角坐標(biāo),aw,ah為網(wǎng)絡(luò)放縮下的寬高。所以首先要對(duì)放縮后的圖像區(qū)域進(jìn)行恢復(fù):

x' = ax * NET_SCALE
y' = ay * NET_SCALE
w' = aw * NET_SCALE
h' = ah * NET_SCALE

這里我們的網(wǎng)絡(luò)放縮系數(shù)NET_SACLE為8。

然后進(jìn)行Bounding Box回歸:

x = x' + dx
y = y' + dy
w = w' * kw
h = h' * kh

得到[x,y,w,h],如果該區(qū)域與其他比它得分高的區(qū)域的IOU>0.5的情況下,該區(qū)域會(huì)被抑制(NMS非極大值抑制)。

測(cè)試網(wǎng)絡(luò)

這里我們給出測(cè)試網(wǎng)絡(luò)的初始化部分:

def loadModel(self,model_path = RPN_BATCH_PATH):
        """
        從model_path中加載模型
        """
        with tf.compat.v1.variable_scope('RPN', reuse=tf.compat.v1.AUTO_REUSE):
            weights = {
                'rpn_1':tf.compat.v1.get_variable(name = 'w_rpn_1_1',shape = [3,3,K*K*2,1]), # 高:寬 1:1的卷積
                'rpn_2':tf.compat.v1.get_variable(name = 'w_rpn_1_2',shape = [3,6,K*K*2,1]), # 高:寬 1:2的卷積
                'rpn_3':tf.compat.v1.get_variable(name = 'w_rpn_2_1',shape = [6,3,K*K*2,1]), # 高:寬 2:1的卷積
                'rpn_4':tf.compat.v1.get_variable(name = 'w_rpn_2_2',shape = [6,6,K*K*2,1]),
                'rpn_5':tf.compat.v1.get_variable(name = 'w_rpn_2_4',shape = [6,12,K*K*2,1]),
                'rpn_6':tf.compat.v1.get_variable(name = 'w_rpn_4_2',shape = [12,6,K*K*2,1]),
                'rpn_7':tf.compat.v1.get_variable(name = 'w_rpn_4_4',shape = [12,12,K*K*2,1]),
                'rpn_8':tf.compat.v1.get_variable(name = 'w_rpn_4_8',shape = [12,24,K*K*2,1]),
                'rpn_9':tf.compat.v1.get_variable(name = 'w_rpn_8_4',shape = [24,12,K*K*2,1])
            }
            biases = {
                'rpn_1':tf.compat.v1.get_variable(name = 'b_rpn_1_1',shape = [1,]),
                'rpn_2':tf.compat.v1.get_variable(name = 'b_rpn_1_2',shape = [1,]),
                'rpn_3':tf.compat.v1.get_variable(name = 'b_rpn_2_1',shape = [1,]),
                'rpn_4':tf.compat.v1.get_variable(name = 'b_rpn_2_2',shape = [1,]),
                'rpn_5':tf.compat.v1.get_variable(name = 'b_rpn_2_4',shape = [1,]),
                'rpn_6':tf.compat.v1.get_variable(name = 'b_rpn_4_2',shape = [1,]),
                'rpn_7':tf.compat.v1.get_variable(name = 'b_rpn_4_4',shape = [1,]),
                'rpn_8':tf.compat.v1.get_variable(name = 'b_rpn_4_8',shape = [1,]),
                'rpn_9':tf.compat.v1.get_variable(name = 'b_rpn_8_4',shape = [1,])
            }
        with tf.compat.v1.variable_scope('BBOX', reuse=tf.compat.v1.AUTO_REUSE):
            weights['bbox'] = tf.compat.v1.get_variable(name = 'w_bbox',shape = [K,K,K*K*2,4]) # 分類(lèi)
            biases['bbox'] = tf.compat.v1.get_variable(name = 'b_bbox',shape = [4,]) # 分類(lèi)
        weights['down'] = tf.compat.v1.get_variable(name = 'w_down',shape = [1,1,2048,1024])# 降采樣
        weights['feature'] = tf.compat.v1.get_variable(name = 'w_feature',shape = [1,1,1024,K*K*2])
        biases['down'] = tf.compat.v1.get_variable(name = 'b_down',shape = [1024,]) # 降采樣
        biases['feature'] = tf.compat.v1.get_variable(name = 'b_feature',shape = [K*K*2,])
        self.img = tf.compat.v1.placeholder(dtype = tf.float32,shape = (1,self.h,self.w,3))
        # 使用無(wú)pool1&pool5的RESNET 101
        net, endpoints = my_resnet(self.img,global_pool = False,num_classes=None,is_training=True,reuse = tf.compat.v1.AUTO_REUSE) # net's w&h = original_img's w&h / 16
        net = tf.nn.conv2d(input = net,filter = weights['down'],strides = [1, 1, 1, 1],padding = 'VALID')
        net = tf.add(net,biases['down'])
        # 生成feature_map
        self.feature_map = tf.nn.conv2d(input = net,filter = weights['feature'],strides = [1, 1, 1, 1],padding = 'VALID')
        self.feature_map = tf.add(self.feature_map,biases['feature'])
        self.pred_rpn = [None]*9
        for i in range(9):
            r = tf.nn.conv2d(input = self.feature_map,filter = weights['rpn_' + str(i+1)],strides = [1, 1, 1, 1],padding = 'VALID')
            r = tf.reshape(r,r.get_shape().as_list()[1:-1])
            self.pred_rpn[i] = tf.add(r,biases['rpn_' + str(i+1)])
            self.pred_rpn[i] = tf.sigmoid(self.pred_rpn[i])
        self.select = tf.compat.v1.placeholder(dtype = tf.float32,shape = (self.RPN_RESULT_NUM,K,K,K*K*2))
        self.pre_bbox = tf.nn.conv2d(self.select,weights['bbox'],[1,1,1,1],padding = 'VALID')
        self.pre_bbox = tf.add(self.pre_bbox,biases['bbox'])
        self.pre_bbox = tf.reshape(self.pre_bbox,shape = (self.RPN_RESULT_NUM,4))
        saver = tf.compat.v1.train.Saver(tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.TRAINABLE_VARIABLES))
        self.sess =  tf.compat.v1.Session()
        init = tf.compat.v1.global_variables_initializer()
        self.sess.run(init)
        saver.restore(self.sess,RPN_BATCH_PATH)

結(jié)果預(yù)覽

我們從測(cè)試集隨機(jī)取出兩張圖片進(jìn)行測(cè)試
我們?cè)跍y(cè)試時(shí),需要把圖像resize到合適的大小,這里選擇的是192*384,得益于我們改進(jìn)后的RESNET101_V2,我們的最小寬度和長(zhǎng)度是普通網(wǎng)絡(luò)的1/8,可以適配于我們測(cè)試集,也能適配于大多數(shù)情況。

第一張圖片:
RPN結(jié)果:

經(jīng)過(guò)Bounding Box回歸后

我們選取了一張圖中的TOP5Answer,即得分最高的5個(gè)anchors,如RPN結(jié)果。
之后采取了Bounding Box回歸,得到了最終結(jié)果,如第二張圖所示。
我們可以看到RPN選取的anchors只包括了頭像中的中間部分,經(jīng)過(guò)Bounding Box回歸之后,選取框完好的罩住了頭像。

RPN結(jié)果:

經(jīng)過(guò)Bounding Box回歸后

同樣,RPN選取的anchors與真實(shí)框有偏移,而B(niǎo)ounding Box回歸修補(bǔ)了偏移量。

我們上面測(cè)試時(shí)采用Top5Answer是由于我們的網(wǎng)絡(luò)是在個(gè)人電腦上訓(xùn)練的,訓(xùn)練次數(shù)有限且訓(xùn)練時(shí)長(zhǎng)也有限,所以訓(xùn)練出來(lái)的模型效果還不能達(dá)到能完全識(shí)別出人臉,所以Top5Answer的機(jī)制可以顯著提高識(shí)別機(jī)率,當(dāng)然也會(huì)帶來(lái)額外的計(jì)算量。

運(yùn)行速度:

這里我們的速度在2.6s一張圖左右,這也是由于我們使用的個(gè)人電腦性能不足的原因,也是由于我們?cè)诮Y(jié)果測(cè)試時(shí)同時(shí)進(jìn)行了繪圖和分析結(jié)果所帶來(lái)的額外計(jì)算量。

到此這篇關(guān)于基于Python的人臉檢測(cè)與分類(lèi)的文章就介紹到這了,更多相關(guān)python人臉檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Python生成二維碼的教程詳解

    Python生成二維碼的教程詳解

    作為一名合格的?Python?程序員,在工作中必然會(huì)用到二維碼相關(guān)操作,那如何快速的用?Python?實(shí)現(xiàn)呢?別著急,咱們這篇博客就為你解決
    2022-10-10
  • 一文學(xué)會(huì)VSCode使用python

    一文學(xué)會(huì)VSCode使用python

    Pycharm用著卡還收費(fèi)!何不試試VSCode!一文學(xué)會(huì)VSCode使用python,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-08-08
  • Python利用百度地圖獲取兩地距離(附demo)

    Python利用百度地圖獲取兩地距離(附demo)

    本文主要介紹了Python利用百度地圖獲取兩地距離,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Python排序方法中sort和sorted的區(qū)別詳解

    Python排序方法中sort和sorted的區(qū)別詳解

    在python中常用的排序函數(shù)就是sort()和sorted()這兩個(gè)函數(shù),使用 sort() 或內(nèi)建函數(shù) sorted() 對(duì)列表進(jìn)行排序,本文將詳細(xì)介紹sorted和sort兩者之間的區(qū)別,感興趣的可以了解一下
    2023-08-08
  • Python面試題之統(tǒng)計(jì)哈希列表中最多元素

    Python面試題之統(tǒng)計(jì)哈希列表中最多元素

    這篇文章主要為大家講解Python面試題中的如何統(tǒng)計(jì)哈希列表中最多的元素,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家面試成功
    2021-09-09
  • 解決python 3 urllib 沒(méi)有 urlencode 屬性的問(wèn)題

    解決python 3 urllib 沒(méi)有 urlencode 屬性的問(wèn)題

    今天小編就為大家分享一篇解決python 3 urllib 沒(méi)有 urlencode 屬性的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用

    pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用

    這篇文章主要介紹了pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換

    python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換

    這篇文章主要介紹了python 實(shí)現(xiàn)docx與doc文件的互相轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python Sqlite3以字典形式返回查詢(xún)結(jié)果的實(shí)現(xiàn)方法

    Python Sqlite3以字典形式返回查詢(xún)結(jié)果的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇Python Sqlite3以字典形式返回查詢(xún)結(jié)果的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • 最新評(píng)論