环境配置看上一贴

https://www.cnblogs.com/clemente/p/10386479.html

1 安装darknet

1-1 克隆darknet repo

git clone https://github.com/pjreddie/darknet.git
cd darknet

1-2 修改Makefile

注意提前备份一份 Makefile.bak

GPU环境下的编译配置都是在 /darknet/Makefile 文件中定义的,根据不同的GPU环境

有几处需要具体根据实际配置对Makefile进行修改

1-2-1.更改CUDA的路径

49-53行

ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif

修改为

ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/ #/usr/后面填你的cuda实际位置
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand #/usr/后面填你的cuda实际位置
endif

当然我们这里不需要修改,默认就是正确位置

1-2-2.修改ARCH配置

Loadingweights from yolo.weights…Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0’ failed.
Aborted (core dumped)

这是因为配置文件Makefile中配置的GPU架构和本机GPU型号不一致导致的。
更改前默认配置如下(不同版本可能有变):

7-10行

ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52]

compute_30表示显卡的计算能力是3.0,几款主流GPU的compute capability列表:
显卡计算能力查询:https://blog.csdn.net/u010159842/article/details/56666158

我的是 笔记本版 gtx1060 对应的6.1

修改为

ARCH= -gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52]

1-2-3.修改nvcc地址

NVCC=nvcc 

修改为

NVCC=/usr/local/cuda/bin/nvcc

总结几处需要自己配置的地方

GPU=1 #如果使用GPU设置为1,CPU设置为0
CUDNN=1 #如果使用CUDNN设置为1,否则为0
OPENCV=1 #如果调用摄像头,还需要设置OPENCV为1,否则为0
OPENMP=0 #如果使用OPENMP设置为1,否则为0
DEBUG=0 #如果使用DEBUG设置为1,否则为0 ..... ARCH= -gencode arch=compute_61,code=sm_61 \ #根据自己的显卡的计算能力进行修改
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] ......
CC=gcc
CPP=g++
NVCC=/usr/local/cuda/bin/nvcc #NVCC=nvcc 修改为自己的路径 .....
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/ #修改为自己的路径
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand #修改为自己的路径
endif

1-3 编译

make -j4

2 测试

2-1 测试OpenCV demo

./darknet imtest data/eagle.jpg

最后终端报错显示

./darknet: error while loading shared libraries: libcudart.so.9.0: cannot open shared object file: No such file or directory

输入

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

发现正常运行,故是系统路径问题

解决方法: 将相应的库文件复制到/usr/lib

sudo cp /usr/local/cuda/lib64/libcudart.so.9.0 /usr/local/lib/
sudo cp /usr/local/cuda/lib64/libcublas.so.9.0 /usr/local/lib/
sudo cp /usr/local/cuda/lib64/libcurand.so.9.0 /usr/local/lib/
#sudo cp /usr/local/cuda/lib64/libcudnn.so. /usr/local/lib/
sudo cp /usr/local/cuda/lib64/libcudnn.so.7.3. /usr/local/lib/
sudo ldconfig

ldconfig命令是一个动态链接库管理命令,是为了让动态链接库为系统共享

重新测试opencv demo

./darknet imtest data/eagle.jpg

2-2 在一张测试图片上测试yolov3和yolov2

# 下载yolov3-weights
wget https://pjreddie.com/media/files/yolov3.weights
# 下载yolov2-weights
wget https://pjreddie.com/media/files/yolov2.weights
# 测试yolov3
sudo ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
# 测试yolov2
sudo ./darknet detect cfg/yolov2.cfg yolov2.weights data/dog.jpg

yolov2运行正常

yolov3发现如下错误

CUDA Error: out of memory
darknet: ./src/cuda.c:: check_error: Assertion `' failed.
Aborted

运行现存不足,需要修改yolo配置文件

../darknet/cfg/yolov3.cfg
[net]
# Testing
# batch=
# subdivisions=
# Training
batch=
subdivisions=64 #修改这里为64
width=
height=
channels=
momentum=0.9
decay=0.0005
angle=
saturation = 1.5
exposure = 1.5
hue=.

subdivisions:这个参数会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半,默认值16在笔记本显存水平会爆CUDA Error: out of memory,当然如果你的配置够强,是没有这个报错的

下面附一份yolo配置文件理解

[net]
batch= 每batch个样本更新一次参数。
subdivisions= 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。
在darknet代码中,会将batch/subdivisions命名为batch。
height= input图像的高
width= Input图像的宽
channels= Input图像的通道数
momentum=0.9 动量
decay=0.0005 权重衰减正则项,防止过拟合
angle= 通过旋转角度来生成更多训练样本
saturation = 1.5 通过调整饱和度来生成更多训练样本
exposure = 1.5 通过调整曝光量来生成更多训练样本
hue=. 通过调整色调来生成更多训练样本 learning_rate=0.0001 初始学习率
max_batches = 训练达到max_batches后停止学习
policy=steps 调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
steps=,, 根据batch_num调整学习率
scales=,.,. 学习率变化的比例,累计相乘 [convolutional]
batch_normalize= 是否做BN
filters= 输出多少个特征图
size= 卷积核的尺寸
stride= 做卷积运算的步长
pad= 如果pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/
activation=leaky 激活函数:
logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair [maxpool]
size= 池化层尺寸
stride= 池化步进 [convolutional]
batch_normalize=
filters=
size=
stride=
pad=
activation=leaky [maxpool]
size=
stride= ......
...... ####### [convolutional]
batch_normalize=
size=
stride=
pad=
filters=
activation=leaky [convolutional]
batch_normalize=
size=
stride=
pad=
filters=
activation=leaky [route] the route layer is to bring finer grained features in from earlier in the network
layers=- [reorg] the reorg layer is to make these features match the feature map size at the later layer.
The end feature map is 13x13, the feature map from earlier is 26x26x512.
The reorg layer maps the 26x26x512 feature map onto a 13x13x2048 feature map
so that it can be concatenated with the feature maps at 13x13 resolution.
stride= [route]
layers=-,- [convolutional]
batch_normalize=
size=
stride=
pad=
filters=
activation=leaky [convolutional]
size=
stride=
pad=
filters= region前最后一个卷积层的filters数是特定的,计算公式为filter=num*(classes+)
5的意义是5个坐标,论文中的tx,ty,tw,th,to
activation=linear [region]
anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 预选框,可以手工挑选,
也可以通过k means 从训练样本中学出
bias_match=
classes= 网络需要识别的物体种类数
coords= 每个box的4个坐标tx,ty,tw,th
num= 每个grid cell预测几个box,和anchors的数量一致。当想要使用更多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝试调大object_scale
softmax= 使用softmax做激活函数
jitter=. 通过抖动增加噪声来抑制过拟合
rescore= 暂理解为一个开关,非0时通过重打分来调整l.delta(预测值与真实值的差) object_scale= 栅格中有物体时,bbox的confidence loss对总loss计算贡献的权重
noobject_scale= 栅格中没有物体时,bbox的confidence loss对总loss计算贡献的权重
class_scale= 类别loss对总loss计算贡献的权重
coord_scale= bbox坐标预测loss对总loss计算贡献的权重 absolute=
thresh = .
random= random为1时会启用Multi-Scale Training,随机使用不同尺寸的图片进行训练。

2-3 在一张测试图片上测试yolov3-tiny

# 下载yolov3-tiny.weights
wget https://pjreddie.com/media/files/yolov3-tiny.weights
# 测试
sudo ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg

速度非常快,在1060上fps147

2-4 使用网络摄像头上测试yolo

先检查摄像头是否正常工作

sudo apt-get install cheese

终端输入cheese,如果弹出摄像头窗口,说明摄像头正常

cheese

检查摄像头id,一般id为0

ls /dev/video*

yolov2

sudo ./darknet detector demo cfg/coco.data cfg/yolov2.cfg yolov2.weights

yolov3

sudo ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

yolov3-tiny

sudo ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg  yolov3-tiny.weights

检测帧率似乎锁帧了 不管是yolov2还是yolov3,yolov3-tiny 一直在10FPS

如果要使用外部usb 摄像头 请用

sudo ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg  yolov3-tiny.weights -c 1

其中1替换成 ls /dev/video* 中显示的id 号(设备号)

2-5 使用yolo检测视频文件

yolov3检测视频

sudo ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights data/webwxgetvideo.mp4

yolov2检测视频

sudo ./darknet detector demo cfg/coco.data cfg/yolov2.cfg yolov2.weights data/webwxgetvideo.mp4

Yolov3 darknet训练后可能会检测不出物体 或者检测标示错误

sudo ./darknet detect cfg/yolo-obj.cfg  yolo-obj_1200.weights data/containership98.jpg

发现检测位置正确,但标示错了

原因是 没有显式得指明你的xx.data文件 而使用了默认的coco.names文件的类别的cfg/coco.data文件

sudo ./darknet detector test cfg/obj.data  cfg/yolo-obj.cfg  yolo-obj_1200.weights data/containership98.jpg

整理了一下,随手记一下。

在终端里,直接运行时Yolo的Darknet的各项命令,/home/wp/darknet/cfg/coco.data文件,使用原件:
=======================================coco.data=====================================================
classes= 80
train  = /home/pjreddie/data/coco/trainvalno5k.txt
valid  = coco_testdev
#valid = data/coco_val_5k.list
names = data/coco.names
backup = /home/pjreddie/backup/
eval=coco
====================================================================================================

(1)检测一张图片
wp@wp-MS-7519:~/darknet$ ./darknet detect cfg/yolov3.cfg wp_data/yolov3.weights data/dog.jpg

出现问题:
./darknet detector test cfg/yolov3.cfg wp_data/yolov3.weights data/dog.jpg报错names: Using default 'data/names.list'。。。Couldn't open file: data/names.list
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg 没有结果出来。

(2)检测一段视频
接好usb后,直接运行usb视频检测
wp@wp-MS-7519:~/darknet$ ./darknet detector demo /home/wp/darknet/cfg/coco.data /home/wp/darknet/cfg/yolov3.cfg /home/wp/darknet/weights/yolov3.weights
说明:在CPU下,运行的特别卡。"直接接USB,然后执行:./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights就可以了啊,

官网https://pjreddie.com/darknet/yolo/说的很详细的。"

++++++++++++++++++++++++++++++++++++YOLO V3常用命令总结++++++++++++++++++++++++++++++++++++++++++++++
参考@http://www.cnblogs.com/pprp/p/9525508.html
(1)在GPU下训练自己的模型
    1.1 单GPU训练:./darknet -i <gpu_id> detector train <data_cfg> <train_cfg> <weights>
$ ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

1.2 多GPU训练,格式为0,1,2,3:./darknet detector train <data_cfg> <model_cfg> <weights> -gpus <gpu_list>
$ ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3

(2)单张测试命令:
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

添加阈值:阈值范围0~1,By default, YOLO only displays objects detected with a confidence of .25 or higher. You can change this by passing the -thresh <val> flag to the yolo command. For example, to display all detection you can set the threshold to 0:
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

(3)批量测试图片
    官网的测试命令,只能单张测试,如果需要批量测试则yolov3-voc.cfg(cfg文件夹下)文件中batch和subdivisions两项必须为1,并修改detector.c文件中的相关地方,重新进行编译make clean,make。
    开始批量测试:
$ ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_20000.weights
    接着在终端中,输入Image Path(所有的测试文件的路径,可以复制voc.data中valid后边的路径):
/home/learner/darknet/data/voc/2007_test.txt # 完整路径。
    结果都保存在./data/out(detector.c中设定路径)文件夹下。

(4)生成预测结果:
$ ./darknet detector valid <data_cfg> <test_cfg> <weights> <out_file>
    yolov3-voc.cfg(cfg文件夹下)文件中batch和subdivisions两项必须为1。
    结果生成在<data_cfg>的results指定的目录下以<out_file>开头的若干文件中,若<data_cfg>没有指定results,那么默认为<darknet_root>/results。
    执行语句如下:在终端只返回用时,在./results/comp4_det_test_[类名].txt里保存测试结果
$ ./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_20000.weights

(5)官网的测试命令作为入口 @https://pjreddie.com/darknet/yolo/
5.1 单张测试命令:
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
./darknet 是执行当前文件下面已经编译好的darknet文件
detect 是命令 后面三个分别是参数: 网络模型 网络权重 需要检测的图片
命令“ ./darknet detect ”等同于“ ./darknet detector test ”,The detect command is shorthand for a more general version of the command. It is equivalent to the command:
$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
 
5.2 多张测试命令:
$ ./darknet detect cfg/yolov3.cfg yolov3.weights
Enter Image Path: data/dog1.jpg
Enter Image Path: data/dog2.jpg

5.3 改变阈值
YOLO默认阈值0.25,可以自行设定:
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

5.4 Real-Time Detection on a Webcam
实时视频检,测需要Darknet with CUDA and OpenCV,-c <num>,OpenCV默认为0:
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

本地视频检,直接输入视频:
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

5.5 在预训练的模型上继续训练
在 CPU  下训练:$ ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
在 多GPU下训练:$ ./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3
从定点继续训练:$ ./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3.backup -gpus 0,1,2,3

5.6 测试公开数据
$ ./darknet detector test cfg/openimages.data cfg/yolov3-openimages.cfg yolov3-openimages.weights

=====================================================
(6)对  视频 进行测试命令:
对本地视频进行测试 命令:
>>>Darknet环境中,$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/xxx.mp4
>>>OpenCV 环境中, $ python3 object_detection_yolo.py --video=run.mp4
【a single image:
    python3 object_detection_yolo.py --image=bird.jpg
 a video file:
    python3 object_detection_yolo.py --video=run.mp4 】

对USB摄像头视频进行测试 命令:
>>>Darknet环境中,$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights
>>>OpenCV 环境中, $ (暂略)

对WebCam网络视频(比如大华、海康相机)进行测试 命令:
这里使用命令前需要作相应的修改,需要相机+电脑在同一局域网,这样才能访问。首先,要知道相机的IP,然后在电脑里添加相机的六段IP地址,在IPv4中添加类似:192.168.6.111,前二位表示在同一局域网,第三位1表示1段的IP、6表示6段的IP。接着获取相机的用户名、密码。这样才能使用 添加摄像机 命令,
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights  rtsp://admin:hik12345@30.14.199.6:554/h265/ch1/main/av_stream
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights  rtsp://admin:abcd12345@30.14.6.192:554/Streaming/Channels/1/
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights  rtsp://admin:abcd12345@30.14.6.192:554/Streaming/Channels/101/

+++++++++++++++++++++++++++++++++《摄像机Rtsp地址格式大全》++++++++++++++++++++++++++++++
@https://www.cnblogs.com/dpf-10/p/5533698.html
@http://www.mamicode.com/info-detail-2190692.html
@https://blog.csdn.net/viola_lulu/article/details/53330727
 一. 海康、中威摄像机
     格式1
         主码流:rtsp://admin:12345@192.168.1.64:554/Streaming/Channels/1
         子码流:rtsp://admin:12345@192.168.1.64:554/Streaming/Channels/2
       第三码流:rtsp://admin:12345@192.168.1.64:554/Streaming/Channels/3
     格式2

rtsp://admin:12345@192.168.1.64:554/ch1/main/av_stream

如果摄像机密码是a12345678,IP是192.168.1.64,RTSP端口默认554未做改动,是H.264编码,那么
主码流取流:
rtsp://admin:a12345678@192.168.1.64:554/h264/ch1/main/av_stream
子码流取流:
rtsp://admin:a12345678@192.168.1.64:554/h264/ch1/sub/av_stream
【如果是H.265编码的,那么将H.264替换成H.265即可】

y7000笔记本 darknet-yolo安装与测试(Ubuntu18.04+Cuda9.0+Cudnn7.1)的更多相关文章

  1. Ubuntu18.04+CUDA9.0+cuDNN7.1.3+openface安装总结

    目录 前言 编译工具CMake C++标准库安装 下载OpenFace代码 OpenCV安装 luarocks-Lua 包管理器,提供一个命令行的方式来管理 Lua 包依赖.安装第三方 Lua 包等功 ...

  2. Ubuntu18.04 + CUDA9.0 + cuDNN7.3 + Tensorflow-gpu-1.12 + Jupyter Notebook深度学习环境配置

    目录 一.Ubuntu18.04 LTS系统的安装 1. 安装文件下载 2. 制作U盘安装镜像文件 3. 开始安装 二.设置软件源的国内镜像 1. 设置方法 2.关于ubuntu镜像的小知识 三.Nv ...

  3. Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结

    Ubuntu18.04发行已经有一段时间了,正好最近Tensorflow也发布了1.8版本,于是决定两个一起装上,以下是安装总结,大致可 以分为5个步骤 确认当前软件和硬件环境.版本 更新显卡驱动,软 ...

  4. Ubuntu18.04 + cuda9.0+cudnn7.0

    1 cannot find Toolkit in /usr/local/cuda-8.0 2017年05月27日 17:37:33 阅读数:2754  对于新版本ubuntukylin17.04安装C ...

  5. ubuntu18.04+ cuda9.0+opencv3.1+caffe-ssd安装

    详细Ubuntu18.04,CUDA9.0,OpenCV3.1,Tensorflow完全配置指南 问题1:使用Cmake编译opencv源码 CMake Error: The following va ...

  6. ubuntun16.04+cuda9.0+cudnn7+anaconda3+pytorch+anaconda3下py2安装pytorch

    一.电脑配置 说明: 电脑配置: LEGION笔记本CPU Inter Core i7 8代GPU NVIDIA GeForce GTX1060Windows10 所需的环境: Anaconda3(6 ...

  7. y7000笔记本 darknet-yolo安装与测试(Ubuntu16.04+Cuda9.0+Cudnn7.1)

    https://zhuanlan.zhihu.com/p/41096599 1.先查看是否安装有以下组件,若有先考虑彻底删除再安装(安装严格按照下面顺序进行) 查看nvidia 版本 nvidia-s ...

  8. Ubuntu16.04 + cuda9.0 + cudnn7.1.4 + tensorflow安装

    安装前的准备 UEFI 启动GPT分区 Win10和Ubuntu16.04双系统安装 ubuntu16.04 NVIDIA 驱动安装 ubuntu16.04 NVIDIA CUDA8.0 以及cuDN ...

  9. 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境

    因为实验室服务器资源有限,我被分配的服务器经常变化,但是常常就分到连显卡驱动以及cuda都没有装的服务器,真的很头疼,我已经配了四五台了,特此记录一下,以便以后直接照版本安装. Install nvi ...

随机推荐

  1. Netty实战七之EventLoop和线程模型

    简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提 ...

  2. Syncrhonized 和 Lock的区别和使用

    相信很多小伙伴们初学多线程的时候会被这两个名词搞晕,所以这里专门介绍这两种实现多线程锁的方式的区别和使用场景 Synchronized 这个关键词大家肯定都不陌生,具体的用法就是使用在对象.类.方法上 ...

  3. 面试官:"谈谈分库分表吧?"

    原文链接:面试官:"谈谈分库分表吧?" 面试官:“有并发的经验没?”  应聘者:“有一点.”   面试官:“那你们为了处理并发,做了哪些优化?”   应聘者:“前后端分离啊,限流啊 ...

  4. Vue项目build打包部署到Tomcat后,刷新报404错误解决方案

    问题描述: 一.更新依赖,并打包项目 cd /root/.jenkins/workspace/v-test;npm installcd /root/.jenkins/workspace/v-test; ...

  5. yarn 命令

    使用yarn的优点,简而言之就是:锁定版本,下载之前检查完整性. yarn install //安装依赖 yarn upgrade //更新 yarn upgrade immutable //更新指定 ...

  6. SQLite: sql script demo

    如果有成熟的架构,如何根据数据库关系的表.视图等,进行代码生成架构?减少写代码的时间? -- 考虑主键外键 -- create database geovindu; use geovindu; --2 ...

  7. 如何理解MVC?

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范. 那么MVC框架究竟干了些什么:用一种业务逻辑. ...

  8. dpr,ppi,dip,viewport的一些概念

    一 ppi,dpr,dip,分辨率,屏幕尺寸,设备物理像素,设备独立像素 分辨率:1920px*1080px 在这个设备上纵向上有 1920个像素点(色块)... 屏幕尺寸:5英寸(in) = 5*2 ...

  9. 理解PeopleSoft集成代理(Integration Broker)-第1部分

    PeopleSoft 集成代理对于那些刚开始开发PeopleSoft的工程师来说是模糊的,因此,本文的目的是帮助哪些想要了解Peoplesoft集成代理的人. 介绍PeopleSoft集成代理 peo ...

  10. Android为TV端助力 Service 两种启动方式的区别

    服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务.这两个方法都 可以启动Service,但是它们的使用场合有所不同.使 ...